Как подавить предупреждения ломбока

У меня есть Сущность

@Builder
class MyEntity {
   private Set<OtherEntitiy> children = new HashSet<>()
}

И я получаю предупреждение ломбока.

предупреждение: @Builder полностью игнорирует инициализирующее выражение. Если вы хотите, чтобы выражение инициализации использовалось по умолчанию, добавьте @Builder.Default. Если его не предполагается устанавливать при построении, сделайте поле final. Установить = новый HashSet‹>();

Вопрос в том, как я могу подавить предупреждение ломбока?

Также. Мне нужно инициализировать детей, потому что я хочу избежать исключения NullPointerException. Также я не могу пометить этот файл как окончательный, потому что на самом деле он не окончательный. Я не могу пометить поле @Builder.Default, потому что я хочу создать этот объект не только с помощью конструктора, и я хочу сохранить значение по умолчанию для других конструкторов.


person Bukharov Sergey    schedule 05.09.2017    source источник
comment
Я думаю, Ломбок пытается сказать вам, что он всегда перезаписывает это значение. github.com/rzwitserloot/lombok/issues/916 Я не очень хорошо знаю Ломбок очень хорошо, но обходной путь может состоять в том, чтобы нацелить конструктор с @Builder вместо класса.   -  person Radiodef    schedule 05.09.2017
comment
Я думаю, что предупреждение говорит само за себя, и вам следует подумать об исправлении предупреждения, следуя предложениям в сообщении, вместо того, чтобы пытаться его подавить.   -  person dpr    schedule 05.09.2017
comment
@dpr ты прав. Сначала нам нужно подумать, как решить проблему. Но в данном случае предлагаемое решение неприемлемо. Я объяснил это в своем вопросе выше.   -  person Bukharov Sergey    schedule 05.09.2017
comment
Вот несколько идей: 1. Можно добавить @AllArgsConstructor(access=AccessLevel.PRIVATE) и убрать инициализацию. Builder выполнит инициализацию, и вы не будете называть себя приватным ctor. +++ 2. Возможно, вы могли бы использовать @Singular. +++ 3. Поле, вероятно, должно быть окончательным, так как вы можете сделать все, изменив коллекцию, а не заменив ее.   -  person maaartinus    schedule 05.09.2017


Ответы (1)


Используйте @Builder.Default, чтобы добавить поведение по умолчанию для вашего Builder

@Builder
class MyEntity {
   @Builder.Default
   private Set<String> children = new HashSet<>();
}

Вы используете его в поле, для которого определено значение по умолчанию, Lombok
затем подберет значение во время создания объекта

@Builder.Default была добавлена ​​в lombok v1.16.16., поэтому, если вы используете более раннюю версию Lombok, вы не сможете ее использовать.

person Daniel Taub    schedule 23.12.2017
comment
как это может быть принятым ответом, когда ОП говорит, что я не могу пометить файл @Builder.Default, потому что ...? - person Niccolò; 18.09.2018
comment
В версии 1.16.16 с этим была известная проблема/ошибка. Вот ссылка: github.com/rzwitserloot/lombok/issues/1347. Эта аннотация удаляла инициализацию по умолчанию из объявления поля, что ломало конструктор без аргументов, если он у вас был, потому что его использование больше не инициализировало бы поля. - person tomosius; 19.09.2018
comment
Дополнительная информация о потенциальной проблеме с использованием Builder.Default: stackoverflow.com/questions/47883931/ - person tomosius; 19.09.2018
comment
@tomosius И он все еще сломан. Builder.Default непригоден, если требуется какой-либо другой конструктор (например, для десериализации JSON). - person kevin cline; 28.01.2020