Трудно поспорить с краткостью в других ответах 1 , ..
несколько упал в пользу, заменен более универсальным ->
.Лично я предпочитаю:
(-> (NutritionFacts$Builder. 240 8)
(.calories 100)
(.sodium 350)
(.carbohydrates 27)
(.build))
Это еще пара символов, но вы получаете две вещи:
- Ясность.Я могу посмотреть на натриевую линию (например) и сказать, что это вызов метода Java, потому что
.
прямо здесь. - Гибкость.Если мне нужно, я могу связать некоторый не-методный вызов в середине (скажем, распечатать его в stdout), или в конце всего этого передать его в другой вызов функции.
Самое главное, что любой другой ответ на этот вопрос неверно назвал класс: Java NutritionFacts.Builder является языковым сахаром по сравнению с реальным классом JVM с именем NutritionFacts $ Builder, и этот класс является тем, к которому должен обращаться Clojure (поскольку мы не используем javacкомпилировать наш код).
1 Я не согласен с предложением doto
: он работает только потому, что этот класс Builder реализует связывание методов путем изменения одного экземпляра, а затемвозвращая это.doto
отлично подходит для объектов Java, которые требуют мутации на месте, но когда класс достаточно любезен, чтобы притвориться, что он неизменен, вам действительно следует использовать версию цепочки методов (т. Е. ->
).