Lombok @SuperBuilder не инициализирует мои объекты класса - PullRequest
0 голосов
/ 12 марта 2020

У меня есть родительский класс и дочерний класс, и я использую @SuperBuilder для создания дочернего объекта, но, похоже, он вообще не инициализируется. Мой родительский класс выглядит следующим образом:

@Getter
@Setter
@Component
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
@SuperBuilder
public class MessageResponse {
    String responseMessage;
}

Мой дочерний класс выглядит следующим образом:

@Getter
@Setter
@Component
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
@SuperBuilder
public class ListResponse extends MessageResponse {
    List<Item> itemList;
    int itemCount;
}

Где Элемент является Serializable классом.

Изначально ListResponse равен

itemList = null
itemCount = 0
responseMessage = null

Когда я пытаюсь построить ListResponse с помощью компоновщика, он вообще не меняет объект ListResponse. Я пытаюсь создать как

//listResponse is @Autowired from Spring and is initially as shown above. 
List<Item> itemList = getItems(); // It returns a list of 15 items, i have checked in debugger, It does.
listResponse.builder()
        .bucketList(itemList)
        .responseMessage("Item List.")
        .bucketCount(itemList.size())
        .build();

Даже после выполнения .build() содержимое этого listResponse объекта все еще (null, 0 , null).

Я пытался искать другие ссылки, касающиеся @SuperBuilder и @Builder, но не получили результата. Может кто-нибудь указать, что здесь происходит не так?

1 Ответ

1 голос
/ 13 марта 2020

Строитель всегда создает новый экземпляр. В этом и состоит цель построения шаблона, и именно так работают сборщики, независимо от того, используете ли вы Lombok @SuperBuilder, @Builder или ручную реализацию сборщика.

Вы можете видеть, что метод builder() метод static, поэтому он не имеет доступа к экземпляру (обычно ваша IDE должна предупредить вас, советуя вместо этого написать ListResponse.builder()).

Если вы хотите создать новый экземпляр, используя В построителе, который предварительно заполнен полями из существующего экземпляра, вы можете использовать toBuilder = true в качестве параметра аннотации в @(Super)Builder. Затем вызовите listResponse.toBuilder().

Если вы хотите изменить экземпляр, шаблон компоновщика не является правильным выбором. Вместо этого используйте сеттеры. Они могут быть сгенерированы Lombok также в свободном, цепном стиле; подробности см. @Accessors.

...