Альтернативы Lombok для чистого кода без геттеров/сеттеров/toString/конструкторов

Знаете ли вы альтернативы Ломбоку? Используя Lombok, мы можем забыть о путанице классов с геттерами, сеттерами и toString. Я хочу использовать его в своем проекте, однако мне интересно, есть ли лучшие альтернативы?

Я использую Java 1.7 и не могу перейти на 1.8.


person Community    schedule 12.02.2014    source источник
comment
Я не думаю, что этот вопрос должен быть закрыт. Хотя это своего рода запрос на инструмент, это довольно фундаментально. Это также можно было бы перефразировать, так как есть способ избежать написания всего общего шаблона Java, не упоминая какой-либо инструмент.   -  person maaartinus    schedule 13.02.2014
comment
@maartinus +1 Как часто закрытие делается для строгого соблюдения правил, а не для наблюдения за намерениями и интересами пользователей… Почему, если это единственный хороший ресурс, который я нахожу при поиске альтернативы Ломбоку, он закрыт? И что определенно плохо в самоуверенных ответах (но это становится метавопросом): если вы ищете что-то другое, кроме Ломбока, у вас есть мнение или интуиция, что, возможно, это не лучший способ иметь дело с шаблонным кодом, и вы хотите мнение других о найденном ими наилучшем пути.   -  person Doc Davluz    schedule 25.09.2014
comment
Как насчет immutables.github.io?   -  person Kohei Nozaki    schedule 28.07.2016


Ответы (2)


Боюсь, альтернативы нет, если только вы не хотите переключиться на что-то вроде Scala или вас устраивает меньший набор функций, подобных тем, которые предоставляет AutoValue.

Хотя AutoValue, вероятно, лучшее, что вы можете получить с чистой Java, она предлагает

  • @Геттер
  • @AllArgsConstructor
  • @EqualsAndHashCode
  • @Нанизывать
  • @Строитель

но он пропускает

  • @Увядание
  • toBuilder
  • @Сеттер
  • @делегат
  • @ExtensionMethod
  • и еще некоторые функции, которыми я не пользуюсь.

Хотя я полностью согласен с тем, что неизменность — это достоинство, иногда это неприменимо. В любом случае, Lombok изо всех сил старается поддерживать неизменяемость, он даже интегрируется с неизменяемыми коллекциями Guava, и вы можете написать

@Builder @Getter public final class Sentence {
    private final boolean truthValue;
    @Singular private final ImmutableList<String> words;    
}

и использовать его как

Sentence s = Sentence.builder().truthValue(true)
    .word("Lombok").word("is").word("cool").build();
assertEquals(3, s.getWords().size());

Примечание: я не автор, поэтому могу сказать, что это круто.

Для неизменяемых @Wither и toBuilder довольно крутые. Первый позволяет создать копию, отличающуюся одним полем, а второй дает вам конструктор, начинающийся с текущих значений и подходящий для изменения нескольких полей. Следующие две строки эквивалентны:

o.withA(1).withB(2)
o.toBuilder().a(1).b(2).build()

И Ломбок, и AutoValue используют магию. Магия последнего заключается в стандартной обработке аннотаций, поэтому она довольно надежна. Он имеет некоторые недостатки, перечисленные на стр. 27. . Я бы добавил тот факт, что генерируется некоторый AutoValue_foo, который я не заказывал.

Ломбок использует некоторую черную магию и, таким образом, гораздо более хрупок, но предлагает больше и работает довольно хорошо.

person maaartinus    schedule 12.02.2014
comment
это, вероятно, лучшее, что вы можете получить с чистой Java - с тем, что Lombok делает с аннотированными классами, по крайней мере, спорно называть ломбокский код чистой Java. - person Michal M; 05.06.2018
comment
@MichalM Это нечисто в том смысле, что он делает вещи, не подпадающие под действие JLS. Вы можете назвать это спорным или Java Plus, если хотите, в любом случае, он работает хорошо и предоставляет сильно отсутствующие и только медленно внедряемые функции в Java. Например, с Java 10 у нас есть var, который уже давно на Ломбоке. На Ломбоке также есть val ... - person maaartinus; 05.06.2018
comment
Полностью согласен. Меня поразила только ваша оригинальная формулировка чистой Java, которая несколько контрастировала с чем-то вроде Scala в вашем ответе. Одной из причин, по которой люди могут неохотно переходить на Scala, Kotlin или что-то еще, может быть обеспечение совместимости исходного кода между JVM и их будущими обновлениями. В связи с этим представление о Lombok как о чистой Java может дать ложное чувство безопасности — за счет всех других функций, которые можно найти полезными, переключившись на альтернативный язык JVM, а не только на Java Plus. - person Michal M; 06.06.2018
comment
Конечно, есть и другие аспекты, такие как знание Java-кода группой разработки или сопровождения. При рассмотрении на этом уровне код Lombok на самом деле едва ли больше, чем чистая Java. Но это только так, все же я предполагаю, что слово чистый пробудило во мне доброго пуриста — простите! - person Michal M; 06.06.2018
comment
стоит отметить, что сборщик также может быть выполнен с помощью immutables.github.io - person xenoterracide; 27.11.2019

«Лучше» здесь довольно спорный вопрос, но есть альтернатива AutoValue, доступная здесь. В этой презентации объясняются некоторые различия между AutoValue и, например, Ломбок.

В частности, AutoValue делает упор на неизменяемость (в общем-то хорошо!) и минимум экстралингвистической магии (очень отличается от Lombok).

person Louis Wasserman    schedule 12.02.2014