Умный builder в Java

250
08 июня 2017, 06:00

Для своей библиотеки решил использовать паттерн билдера. Каким образом можно полностью защитить структуру от вылетов приложения, связанных с ее настройкой? Например, вот, мне нужно, чтобы можно было вызвать только метод centerCrop() или centerInside(), но не оба сразу

Giffy.with(this)
    .load(url)
    .size(gif_container.getWidth(), gif_container.getHeight())
    .centerCrop()
    .centerInside() //ошибка на этапе компиляции
    .loop(true)
    .show(gif_container);
Answer 1

Как альтернатива предложил бы объединить два метода в один, который принимает перечисление:

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*** нет. Это повлияет на последовательность вызовов, так что возможно потребуется вынести все общие методы в отдельный интерфейс, от которого наследовать все остальные билдеры.

READ ALSO
Как сделать границы Floating searchview прозрачными?

Как сделать границы Floating searchview прозрачными?

Здравствуйте, в fsv не могу понять, как сделать границы виджета прозрачными или же поменять их цветВ xml не нашёл нужного аттрибута, может быть...

351
Ошибка инициализации Hibernate(фреймворк Vaadin)

Ошибка инициализации Hibernate(фреймворк Vaadin)

Всем привет пишу мультипользовательский портал, столкнулся с такой проблемойВремя от времени получаю такую ошибку "ExceptionInitializer error at db

340
Организация поиска в listview

Организация поиска в listview

Сделал поиск в listview по примеру, как можно убрать регистровазависимость при поиске, то есть чтобы с маленькой буквы тоже можно было искать

486
Как изменить url swagger-а в spring?

Как изменить url swagger-а в spring?

Нужно чтобы сваггер деплоился не в рут директорию http://localhost:8080/swagger-uihtml, а в отдельную папочку api-docs

504