Открыть список
Как стать автором
Обновить

Комментарии 7

Вот, вставляйте ссылку на соответствующий раздел между корпоративной рекламой вместо перевода очередной бесполезной статьи.
Спасибо, что в современном мире есть именованные аргументы
Именованные аргументы — лишь частный (и очень простой случай) билдера.
По большому счету все это сделано только для того, чтобы не запутаться в порядке инициализации компонент и большом количестве аргументов. Если все имена аргументов самого класса и его компонентов — именованные, никаких проблем — все четко просто и понятно написано.
Я понимаю, что можно извращаться в толковании инициализации, добавлять лямбды, отдельный билдер для каждого аргумента, потом еще написать функции вроде initAfter/initBefore, но все это в конечном случае именованием аргументов решается проще, понятнее и эффективнее.
Просто для размышления — пример последнего листинга может и выглядит эффектно, но ни одного желания понять, что там внутри происходит и как оно работает, не вызывает.
Вроде бы задачка плевая была, а решаем ее, стреляя из пушки по воробьям.
>По большому счету все это сделано только для того, чтобы не запутаться в порядке инициализации компонент и большом количестве аргументов.
Ну может и так быть, наверное даже в большинстве случаев, но это не единственное назначение билдера. Сложный билдер не сводится только к аргументам, а точнее он может билдить разные типы результата в зависимости от их наличия. Ну т.е. к конструктору с дефолтными аргументами он сводится только в этом простейшем случае.

А в более сложном — например наличие одного аргумента (или его определенное значение) приводит к тому, что становится можно задать (или наоборот, нельзя) ряд других аргументов, т.е. на выходе метода билдера — какой-то класс, разный, с разным набором полей и т.п. И вот это нормальное применение билдера. И таких примеров кстати в сети вагон.

ну т.е. вот у меня в проекте скажем Spark, там ровно такое:

spark.read.csv()… и дальше разные параметры чтения из CSV, типа разделителя и т.п.
spark.read.jdbc()… и параметры JDBC соединения, совершенно другие
spark.read.xyz()… — и эти обработчики кстати можно загружать динамически, т.е. это runtime плагины. Но те что известны компилятору — на те будет подсказка в IDE.
Вот да, мне тоже только это на ум пришло. Но опять же, для этого лучше использовать билдеры с анонимными функциями, как например здесь
ktor.io/docs/client.html#features
По сути вместо иницализации класса мы вызываем одноименный метод, куда передаем лямбду, которая в свою очередь относится к пространству билдера. Короче сводим функциональную реализацию к декларативной, где вложенности вызовов порождают необходимые пространства.
Ну яж не про реализацию говорил, а скорее про назначение. А реализации да, есть гораздо более приятные, чем тут описана, а уж особенно если на более гибких языках (в груви билдеры тоже сильно удобнее Java).
Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

Информация

Дата основания
Местоположение
Россия
Сайт
otus.ru
Численность
51–100 человек
Дата регистрации
Представитель
OTUS

Блог на Хабре