2016-07-22 5 views
4

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

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

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

Почему бы вам просто не инициализировать список? –

+2

_ "если список не был инициализирован" _ Я бы рассматривал это как ошибку. Если по какой-то причине вы хотите/нуждаетесь в ленивой инициализации, вы можете взглянуть на документацию - пропустить '@Getter (lazy = true)' невозможно. Кстати, требуемый код такой же, как для первоначальной инициализации списка. – zeroflagL

ответ

5

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

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

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

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

Documentation

+1

_ «Ломбок не поддерживает инициализацию при чтении» _ На самом деле это так. – zeroflagL

+1

@zeroflagL Спасибо, я никогда не использовал это, потому что это невозможно с '@Data', но java-путь есть. – stacker

2

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

Вам не нужна какая-либо магия. Просто инициализируйте list.

0

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

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

E.g.

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

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

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

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

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

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