Аннотации для разных конструкторов в Ломбоке?

У меня есть класс

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 или одним из других конструкторов, генерирующих аннотации.