Инициализировать список, если список равен нулю с 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;
}