Инициализировать список, если list равен null с помощью Lombok getter?


В настоящее время я заменяю все мои стандартные POJO, чтобы использовать Ломбок для всего шаблонного кода. Я обнаружил, что сохраняю геттеры для списков, потому что я хочу вернуть пустой список, если список не был инициализирован. То есть я не хочу, чтобы геттер возвращал 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;
}
4 9

4 ответа:

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

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

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

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

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

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

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

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

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

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

Вам не нужно никакое волшебство, чтобы произойти. Просто инициализируйте list.

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

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

Например

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

public Map<String, String> getParams() {
    return (params == null) ? Collections.emptyMap() : params;
}