Я только что прочитал предварительный просмотр Java 7 (pdf) , и там был слайд на Цепной вызов . Вот пример, используемый на слайде:
// Construction with setters
DrinkBuilder margarita = new DrinkBuilder();
margarita.add("tequila");
margarita.add("orange liqueur");
margarita.add("lime juice");
margarita.withRocks();
margarita.withSalt();
Drink drink = margarita.drink();
// Construction with chained invocation
Drink margarita = new DrinkBuilder()
.add("tequila")
.add("orange liqueur")
.add("lime juice")
.withRocks()
.withSalt()
.drink();
И у меня смешанные чувства по этому поводу. Не следует объединять слишком много вызовов методов в одно утверждение. С другой стороны, писать margarita.this()
и margarita.that()
тоже не слишком удобно.
Теперь я прихожу на Яву из мира Delphi. А в Delphi есть языковая конструкция with
. Это лелеют немногие и ненавидят многие (или наоборот?). Я нахожу with
более элегантным, чем идея цепного вызова (который, я считаю, работает на основе метода void
, возвращающего ссылку на объект, для которого он был вызван - и эта часть мне не нравится, как void
должен вернуть ничего ).
Буду признателен за поддержку языка with
, принятую в Java, поэтому пример кода можно написать так:
Drink margarita = null;
with (new DrinkBuilder()) {
add("tequila");
add("orange liqueur");
add("lime juice");
withRocks();
withSalt();
margarita = drink();
}
Я единственный, кто предпочел бы это решение цепочному вызову? Кто-нибудь еще считает, что with
может быть полезным расширением языка Java? (Напоминает мне о чьем-то вопросе о необходимости "Java ++" ...)