Аннотации для разных конструкторов в Ломбоке?
У меня есть класс
public class Answer<T> {
private T data;
public Answer(T data) {
this.data = data;
}
public Answer() {
}
public T getData() {
return data;
}
public Answer<T> setData(T data) {
this.data = data;
return this;
}
}
который я хочу упростить с помощью Lombok
.
Если добавить аннотацию @AllArgsConstructor
, то я не могу видеть конструктор по умолчанию.
@Data
@AllArgsConstructor
public class Answer<T> {
private T data;
public Answer<T> setData(T data) {
this.data = data;
return this;
}
}
Возможно ли иметь как конструктор в Lombok
?
Ответы
Ответ 1
Ваш класс эквивалентен:
@Accessors(chain = true)
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Answer<T> {
private T data;
}
Хотя, строго говоря, это добавляет методы toString
, equals
и hashCode
к всем переменным. Это может (и часто) вызывает бесконечные циклы. Будьте очень осторожны с @Data
.
@Accessors(chain = true)
делает реализации setter
return this
, более подробно здесь.
Вы можете добавить несколько аннотаций конструктора:
В отличие от большинства других аннотаций lombok, существование явного конструктора не останавливает эти аннотации от создания собственного конструктора.
Обратите внимание, что @Accessors
является экспериментальным, поэтому его можно изменить/переименовать в какой-то будущей точке.
Я предпочитаю @Builder
до @AllArgsConstructor
, поскольку он позволяет устанавливать только требуемые параметры, тогда как все конструкторы аргументов - все или ничего, Он также генерирует гораздо более читаемый код, рассмотрим
new Thing(true, 1, 4, false, 4, 4.0)
Против
new Thing.Builder().
setANamnedProperty(true).
setAnotherNamnedProperty(1).
....
build();
Ответ 2
Вы пробовали это?
@NoArgsConstructor
@AllArgsConstructor
Ответ 3
Попробуй это. Это должно работать. Добавьте также эту аннотацию.
@NoArgsConstructor
@NoArgsConstructor сгенерирует конструктор без параметров. Если это невозможно (из-за последних полей), вместо этого будет возникать ошибка компилятора, если только не используется @NoArgsConstructor (force = true), тогда все конечные поля инициализируются с 0/false/null. Для полей с ограничениями, таких как поля @NonNull, проверка не генерируется, поэтому имейте в виду, что эти ограничения, как правило, не будут выполняться, пока эти поля не будут должным образом инициализированы позже. Для некоторых конструкций Java, таких как hibernate и интерфейс Service Provider, требуется конструктор без аргументов. Эта аннотация полезна прежде всего в сочетании с @Data или одним из других конструкторов, генерирующих аннотации.