Lombok getter / setter vs Java 14 record

10

Я люблю проект Lombok, но в эти дни я читаю и пробую некоторые из новых функций Java 14.

Внутри новой возможности есть ключевое слово record , позволяющее создать класс с уже встроенной следующей функциональностью: конструктор, закрытые конечные поля, методы доступа, equals / hashCode, getters, toString методы.

Теперь мой вопрос: лучше полагаться на функцию Lombok или мы должны начать использовать функциональность записи:

Лучше использовать это:

record Person (String name, String surname) {}

или это:

@AllArgsConstructor
@ToString
@EqualsAndHashCode
public class GetterSetterExample {
  @Getter private int name;
  @Getter private int surname;
}

Каковы плюсы и минусы обоих подходов?

gixlg
источник
Во-первых, recordне будет работать для вещей, ожидающих получения и установки в стиле JavaBeans.
Марк Роттвил
2
Что означает комментарий Роттвила, так это то, что метод доступа к свойству в записи имеет то же имя, что и свойство. Таким образом, alice.phoneNumber()вместо соглашения JavaBeans с префиксом get, как в alice.getPhoneNumber().
Василий Бурк
1
Эта recordфункция является функцией предварительного просмотра , но еще не готова к использованию в производстве.
Базилик Бурк
Записи имеют множество ограничений по сравнению с классами, например, запись не может расширять другие записи или классы, обратитесь к разделу ограничений в этом JEP openjdk.java.net/jeps/359 для получения дополнительной информации
NAIT

Ответы:

9

Lombok и recordособенность языка Java - это разные инструменты для разных вещей. Существует некоторое внешнее совпадение, но не позволяйте этому отвлекать вас.

Ломбок в основном о синтаксическом удобстве; это макропроцессор, предварительно загруженный некоторыми известными полезными шаблонами кода. Это не дает никакой семантики; он просто автоматизирует шаблоны в соответствии с некоторыми ручками, которые вы устанавливаете в коде с аннотациями. Lombok - это просто удобство реализации классов переноса данных.

Записи являются семантической особенностью; они являются именными кортежами . Сделав семантическое объявление, которое Point является кортежем (int x, int y), компилятор может получить свое представление, а также протоколы конструирования, объявления, равенства, хэширования и строкового представления из этого описания состояния. Поскольку они несут семантику, читатели и структуры также могут с большей уверенностью рассуждать об API записей. (Это также может быть синтаксически удобно; если это так, это здорово.)

Брайан Гетц
источник
1
+1 Брайан Гетц: И это при условии, что вы можете загрузить текущую версию Lombok в вашу IDE. Интересно, есть ли у Lombok какое-либо значимое преимущество в отношении более быстрого чтения кода, которое не дадут комментарии класса.
Магистраль
4

Я уже некоторое время играю с этой комбинацией, и, немного потрудившись, могу перечислить следующие отличия:

Ломбок

  • Записи еще не выпущены и являются лишь функцией предварительного просмотра. Так что пребывание с Ломбоком имеет больше смысла.
  • Они еще не настолько мощный инструмент, чтобы уничтожить Ломбок все вместе. Обратите внимание, что библиотека может предложить гораздо больше, чем просто @Getter, @AllArgsConstructor, @ToString, @EqualsAndHashCode.
  • Опыт сам по себе EqualsAndHashCodeне то, что вы ожидаете, когда дело доходит до перехода на записи .

документация

  • С другой стороны, если требование представления вашего объекта должно быть «носителем данных», вы все равно можете воспользоваться преимуществами записей, не полагаясь на дополнительную библиотеку для сокращения стандартного кода, чтобы выполнить это точно. Вот почему в качестве убедительного замечания этот блог гласит следующее:

    Это также поможет командам устранить множество реализаций базового шаблона, написанных вручную, и уменьшить или устранить необходимость в таких библиотеках, как Lombok.

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

Naman
источник
Примечание. Я бы постарался сохранить это в актуальном состоянии, добавив больше примеров того, как пользователь часто использует их в настоящее время.
Наман
3

NB: вместо этой рождественской елки аннотации, вы можете просто использовать @Valueна уроке. Обратите внимание, что это делает класс final, и делает все поля приватными и final, а также все остальные. Это близко к тому, что записи (они тоже являются окончательными, и все поля внутри являются окончательными).

recordвсе еще в предварительном просмотре, так что для производственного кода, очевидно, он пока не подходит. Используйте ломбок.

Как только записи выходят из предварительного просмотра, все становится сложнее. Ломбок намного более гибок; Вы можете легко поменять местами новый аспект без необходимости перезаписывать весь код (вы можете просто, например, добавить предложение 'extends' в свой класс без необходимости затем вручную писать метод equals и hashCode; что-то, что записи не могут дать вам). Lombok также предоставляет вам больше возможностей: например, вы можете добавить конструктор, добавив @Builderаннотацию; не то, что записи могут сделать.

Если маловероятно, что вы собираетесь использовать что-либо из этого для класса, который вы разрабатываете - я бы использовал записи.

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Я основной участник Project Lombok.

rzwitserloot
источник