После общего выпуска 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”