Я люблю проект 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;
}
Каковы плюсы и минусы обоих подходов?
record
не будет работать для вещей, ожидающих получения и установки в стиле JavaBeans.alice.phoneNumber()
вместо соглашения JavaBeans с префиксомget
, как вalice.getPhoneNumber()
.record
функция является функцией предварительного просмотра , но еще не готова к использованию в производстве.Ответы:
Lombok и
record
особенность языка Java - это разные инструменты для разных вещей. Существует некоторое внешнее совпадение, но не позволяйте этому отвлекать вас.Ломбок в основном о синтаксическом удобстве; это макропроцессор, предварительно загруженный некоторыми известными полезными шаблонами кода. Это не дает никакой семантики; он просто автоматизирует шаблоны в соответствии с некоторыми ручками, которые вы устанавливаете в коде с аннотациями. Lombok - это просто удобство реализации классов переноса данных.
Записи являются семантической особенностью; они являются именными кортежами . Сделав семантическое объявление, которое
Point
является кортежем(int x, int y)
, компилятор может получить свое представление, а также протоколы конструирования, объявления, равенства, хэширования и строкового представления из этого описания состояния. Поскольку они несут семантику, читатели и структуры также могут с большей уверенностью рассуждать об API записей. (Это также может быть синтаксически удобно; если это так, это здорово.)источник
Я уже некоторое время играю с этой комбинацией, и, немного потрудившись, могу перечислить следующие отличия:
Ломбок
@Getter, @AllArgsConstructor, @ToString, @EqualsAndHashCode
.EqualsAndHashCode
не то, что вы ожидаете, когда дело доходит до перехода на записи .документация
Конечно, в повседневной жизни всегда разумно, основываясь на требованиях проекта, выбирать, каким путем следовать и практиковать.
источник
NB: вместо этой рождественской елки аннотации, вы можете просто использовать
@Value
на уроке. Обратите внимание, что это делает класс final, и делает все поля приватными и final, а также все остальные. Это близко к тому, что записи (они тоже являются окончательными, и все поля внутри являются окончательными).record
все еще в предварительном просмотре, так что для производственного кода, очевидно, он пока не подходит. Используйте ломбок.Как только записи выходят из предварительного просмотра, все становится сложнее. Ломбок намного более гибок; Вы можете легко поменять местами новый аспект без необходимости перезаписывать весь код (вы можете просто, например, добавить предложение 'extends' в свой класс без необходимости затем вручную писать метод equals и hashCode; что-то, что записи не могут дать вам). Lombok также предоставляет вам больше возможностей: например, вы можете добавить конструктор, добавив
@Builder
аннотацию; не то, что записи могут сделать.Если маловероятно, что вы собираетесь использовать что-либо из этого для класса, который вы разрабатываете - я бы использовал записи.
ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Я основной участник Project Lombok.
источник