Lombok @Builder не инициализирует коллекции

Я использую аннотации Lombok @Data и @Builder следующим образом:

@Data
@Builder(toBuilder = true)
class Movie {

    // Some other fields here.

    private final List<Actor> actors;

}

Когда я создаю новый Movie с помощью компоновщика, не указывая никаких актеров, я ожидаю, что Lombok инициализирует мой список Collections.emptyList(). Но этого не происходит:

List<Actor> actors = Movie.builder().build().getActors();
System.out.println(actors); // Prints 'null'.

В документации для аннотации @Builder это указано в строке 55 и 56 в примере кода для Vanilla Java (https://projectlombok.org/features/Builder.html), что мне следует посмотреть пример кода для @Singular (https://projectlombok.org/features/Singular-snippet.html). В строке 112 в примере Vanilla Java здесь кажется, что список должен быть инициализирован пустым списком.

Я проверил, и это действительно происходит, если я аннотирую список @Singular:

@Data
@Builder(toBuilder = true)
class Movie {

    // Some other fields here.

    @Singular
    private final List<Actor> actors;

}

List<Actor> actors = Movie.builder().build().getActors();
System.out.println(actors); // Prints '[]'.

Это ошибка Ломбока или я что-то не так делаю? Согласно документации, кажется, что список должен быть инициализирован пустым списком в обоих случаях (поскольку документ @Builder ссылается на документ @Singular).


person marstran    schedule 28.09.2015    source источник
comment
Кстати, я использую Lombok версии 1.16.6.   -  person marstran    schedule 28.09.2015


Ответы (2)


Только когда вы используете @Singular, вы получаете пустой список. На странице документации Builder говорится:

с аннотацией @Singular ломбок будет рассматривать этот узел построителя как коллекцию.

Без @Singular ломбок рассматривает его как любой другой объект. Так что это будет null вместо пустой коллекции.

Раскрытие информации: я разработчик Lombok

person Roel Spilker    schedule 29.09.2015
comment
Спасибо! Кстати, аннотация @Singular выдает ошибку, если имя переменной коллекции не может быть сингуляризировано. Однако это немного неудобно, когда в качестве имени переменной используется неисчисляемое существительное (например, слово оборудование или овца). Почему сгенерированный метод единственного числа нельзя назвать так же, как метод множественного числа, вместо того, чтобы выдавать ошибку компиляции? - person marstran; 30.09.2015
comment
Наше небольшое исследование позволило нам поверить, что в реальном программном обеспечении используется не так уж много таких слов. Всякий раз, когда ломбок не уверен, мы ошибаемся из соображений безопасности. Разве это не предупреждение? - person Roel Spilker; 01.10.2015
comment
Я понял, что могу просто указать имя вот так @Singular("equipment"), и это сработало. Спасибо за вашу помощь! - person marstran; 01.10.2015
comment
Или вы можете использовать аннотацию @Builder.Default и инициализировать этот файл самостоятельно. - person Ondřej Stašek; 20.03.2019
comment
Я пытался использовать @Singular, но мой список по-прежнему нулевой, а не пустой список... - person Wrong; 27.08.2019
comment
Потрясающая функция. На самом деле я думаю, что это должно стать значением по умолчанию. - person Jeroen Kransen; 12.12.2020

Начиная с Lombok v1.16.16, вы можете использовать внутреннюю аннотацию @Builder для инициализации вашей коллекции по умолчанию. Например:

@Data
@Builder
class Movie {

@Builder.Default
private final List<Actor> actors = new ArrayList<>();

}

Итак, когда вы создаете новый фильм с помощью конструктора, не указывая актеров:

Movie movie = Movie.builder().build();
movie.getActors(); // Will return instance of ArrayList
person Kovsharov    schedule 04.09.2020
comment
Это сработало для меня (w Lombok v. 1.18.12). Для меня это был лучший ответ, так как он решает именно проблему (такую ​​же, как OP) без необходимости использования аннотации @Singular, которая изменяет другое поведение @Builder, которое мне не нужно. - person Wardibald; 22.04.2021