Инициализировать список, если 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 ответа:
Этого можно достичь, объявив и инициализировав поля. Инициализация будет выполнена при инициализации заключающего объекта.
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; }