После общего выпуска JDK 16: https://jdk.java.net/16/ и особенно https://openjdk.java.net/jeps/396 У Lombok есть несколько проблем со сборкой из-за его зависимости от JDKinternals, который 16 закрыл, обсуждение здесь: https://github.com/rzwitserloot/lombok/issues/2681
Учитывая тот факт, что Java 16 выводит записи из предварительного просмотра, а библиотеки, такие как Lombok (over), полагаются на внутренние функции JDK, имеет ли смысл больше использовать Lombok в нашем коде?
Записи Java не требуют каких-либо дополнительных зависимостей, поэтому, я думаю, лучше использовать их вместо Lombok.
Если ваш проект поддерживает Java 14, вы уже можете использовать их в Eclipse. Для этого на маркетплейсе есть плагин:
Для этого на маркетплейсе есть плагин:
Способ ломбока Добавьте аннотации ломбока поверх класса:
import lombok.AllArgsConstructor; import lombok.Getter; @AllArgsConstructor @Getter public class TransactionLombok { private final String from; private final String to; private final int amount; }
Конструктор со всеми аргументами и получателями генерируется lombok.
TransactionLombok transactionLombok = new TransactionLombok("you", "me", 100); assertThat(transactionLombok.getFrom()).isEqualTo("you"); assertThat(transactionLombok.getTo()).isEqualTo("me"); assertThat(transactionLombok.getAmount()).isEqualTo(100);
Способ записи Определяет запись:
record TransactionRecord(String from, String to, int amount) { }
Вы получаете конструктор и геттеры по умолчанию в записи:
TransactionRecord transactionRecord = new TransactionRecord("you", "me", 100); assertThat(transactionRecord.from()).isEqualTo("you"); assertThat(transactionRecord.to()).isEqualTo("me"); assertThat(transactionRecord.amount()).isEqualTo(100);
Как мы можем видеть, ключевое слово new record выполняет ту же работу гораздо более аккуратно. Что-нибудь еще? Да, записи могут сделать больше, чем это. Он также автоматически предоставляет вам значения equals, hashCode и toString. Так что это тоже работает.
assertThat(transactionRecord.equals(anotherTransactionRecord)).isTrue(); assertThat(transactionRecord.hashCode()).isEqualTo(anotherTransactionRecord.hashCode()); assertThat(transactionRecord.toString()).isEqualTo("TransactionRecord[from=you, to=me, amount=100]");
Находясь в ломбоке, вы должны добиться того же, добавив еще несколько аннотаций, подобных этой:
@ToString @EqualsAndHashCode @AllArgsConstructor @Getter public class TransactionLombok {
Или просто сделайте это ценностью:
@Value public class TransactionLombok {
Таким образом, ключевое слово record можно рассматривать как эквивалент аннотации lombok @Value
. Настраиваемый конструктор Кроме того, records также поддерживает настраиваемые конструкторы, подобные этому:
public TransactionRecord(String from, String to) { this(from, to, 0); }
И если вы хотите проверить аргументы, это также возможно:
public TransactionRecord { Objects.requireNonNull(from); Objects.requireNonNull(to); }
Могут ли записи заменить ломбок? Нет. Несмотря на то, что records предоставляет множество приятных функций и аккуратен в коде, lombok по-прежнему обладает гораздо большим количеством функций, чем records. Например:
@Builder @With public class TransactionLombok {
Записи просто не предоставляют функций построения и клонирования. Поэтому ломбок, скорее всего, еще долго будет сосуществовать с рекордами.
Оригинал: “https://dev.to/gauravratnawat/future-of-lombok-g22”