Для своей библиотеки решил использовать паттерн билдера. Каким образом можно полностью защитить структуру от вылетов приложения, связанных с ее настройкой? Например, вот, мне нужно, чтобы можно было вызвать только метод centerCrop() или centerInside(), но не оба сразу
Giffy.with(this)
.load(url)
.size(gif_container.getWidth(), gif_container.getHeight())
.centerCrop()
.centerInside() //ошибка на этапе компиляции
.loop(true)
.show(gif_container);
Как альтернатива предложил бы объединить два метода в один, который принимает перечисление:
Giffy.with(this)
.load(url)
.size(gif_container.getWidth(), gif_container.getHeight())
.center(CenterType.CROP)
.loop(true)
.show(gif_container);
Чтобы методы нельзя было вызвать, нужно создавать классы, в которых таких методов нет. Приходит в голову решение с цепочкой билдеров:
interface BaseBuilder {
BaseBuilder load(String url);
//...остальные методы ...
CropBuilder centerCrop();
InsideBuilder centerInside();
}
interface CropBuilder {
CropBuilder loop(boolean isLoop);
}
interface InsideBuilder {
InsideBuilder loop(boolean isLoop);
}
Т.о. методы center*** возвращают типы, у которых методов center*** нет. Это повлияет на последовательность вызовов, так что возможно потребуется вынести все общие методы в отдельный интерфейс, от которого наследовать все остальные билдеры.
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости