Инициализировать список, если список равен нулю с lombok getter?

В настоящее время я заменяю все свои стандартные POJO, чтобы использовать Lombok для всего кода шаблона. Я нахожу, что храню getters для списков, потому что я хочу вернуть пустой список, если список не был инициализирован. То есть, я не хочу, чтобы getter возвращал значение null. Если какая-то магия ломбока, о которой я не знаю, может помочь мне избежать этого?

Пример сгенерированного кода

private List<Object> list;
public Object getList(){ return list; }

Вместо этого я хотел бы:

private List<Object> list;
public Object getList(){
    if (list == null) {
        return new ArrayList();
    }
    return list;
}

Ответ 1

Вы можете достичь этого, объявив и инициализировав поля. Инициализация будет выполнена при инициализации окружающего объекта.

private List<Object> list = new ArrayList();

Аннотация Lomboks @Getter предоставляет lazy атрибут, который позволяет ленивую инициализацию.

 @Getter(lazy=true) private final double[] cached = expensiveInitMethod();

Документация

Ответ 2

У меня были те же вопросы, что и у этого. Хотя приведенные выше ответы полезны в некоторых отношениях, точное решение заключается в использовании аннотаций @Builder и @Singular API Lombok, как @Singular ниже в данном коде.

Это работало превосходно для меня.

@Builder
class MyClass{
    @Singular
    private List<Type> myList;
}

Это инициализирует myList с ненулевым объектом List. Хотя этот вопрос старый. Но, все еще отправляя этот ответ, чтобы помочь кому-то, как я, кто будет отвечать на этот вопрос в будущем

Ответ 3

То есть, я не хочу, чтобы getter возвращал значение null. Если какая-то магия ломбока, о которой я не знаю, может помочь мне избежать этого?

Вам не нужна магия, чтобы случиться. Просто инициализируйте list.

Ответ 4

Вы можете переопределить получатель на что угодно, используя AccessLevel.NONE в поле.

Обратите внимание, что простая инициализация поля не защищает вас от клиентов, вызывающих конструктор с нулевыми значениями или вызывающих сеттер с нулевыми значениями (все еще может быть в порядке, в зависимости от того, что вы хотите).

Например

@Getter(AccessLevel.NONE)
private Map<String, String> params;

public Map<String, String> getParams() {
    return (params == null) ? new HashMap<>() : params;
}