Lombok getter / setter vs Java 14 record - PullRequest
       96

Lombok getter / setter vs Java 14 record

10 голосов
/ 19 апреля 2020

Мне нравится проект Ломбок , но в эти дни я читаю и пробую некоторые из новых функций 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;
}

Что плюсы и минусы обоих подходов?

Ответы [ 3 ]

9 голосов
/ 20 апреля 2020

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

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

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

4 голосов
/ 19 апреля 2020

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

Ломбок

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

Записи

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

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

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

3 голосов
/ 19 апреля 2020

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

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

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

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

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Я основной вкладчик проекта Lombok.

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