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

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

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?

2 ответов


ваш класс эквивалентен:

@Accessors(chain = true)
@Data    
@NoArgsConstructor
@AllArgsConstructor
public class Answer<T> {

    private T data;
}

хотя, строго говоря, это добавляет toString, equals и hashCode методы все переменные. Это может (и часто делает) вызвать бесконечные циклы. Будьте очень осторожны @Data.

@Accessors(chain = true) делает setter реализация return this, подробнее здесь.

вы можете добавить несколько примечаний конструктор:

в отличие от большинства других Ломбок аннотации, существование явного конструктора не останавливает эти аннотации от создания собственного конструктора.

отметим, что @Accessors является экспериментальным, поэтому может быть изменен / переименован в какой-то момент в будущем.

предпочитаю @Builder to @AllArgsConstructor как это позволяет только требуются параметры для установки, тогда как конструктор всех аргументов-это все или ничего. Он также генерирует гораздо более читаемый код, считать

new Thing(true, 1, 4, false, 4, 4.0)

и

new Thing.Builder().
    setANamnedProperty(true).
    setAnotherNamnedProperty(1).
    ....
    build();

вы пробовали это?

@NoArgsConstructor
@AllArgsConstructor