使用Lombok Builder注释抛出UnsupportedOperationException

naz*_*art 7 java list builder-pattern lombok runtimeexception

我正在使用Lombok进行我的项目.我的模型看起来像:

@Builder
@Data @AllArgsConstructor
public class ScreenDefinitionDTO {
    @Singular
    private List<ScreenDeclaration> screens;
}
Run Code Online (Sandbox Code Playgroud)

我想做下一步操作:

String screenName = ctx.screenName().getText();
ScreenDeclaration declaration = ParsingUtils
                .buildScreenDeclaration(StringUtils.trim(screenName));
Run Code Online (Sandbox Code Playgroud)

在哪里创建实例:

public static ScreenDefinitionDTO buildEmptyScreenDTO() {
    return ScreenDefinitionDTO.builder()
            .screens(new ArrayList<>())
            .build();
}
Run Code Online (Sandbox Code Playgroud)

最后,我得到了:

Exception in thread "main" java.lang.UnsupportedOperationException
    at java.util.AbstractList.add(AbstractList.java:148)
    at java.util.AbstractList.add(AbstractList.java:108)
Run Code Online (Sandbox Code Playgroud)

当我在没有Lombok构建器模式的情况下更改创建实例时,一切都很好:

public static ScreenDefinitionDTO buildEmptyScreenDTO() {
    return new ScreenDefinitionDTO(new ArrayList<>());
}
Run Code Online (Sandbox Code Playgroud)

我无法理解Lombok的构建器模式有什么问题?

fbo*_*kov 8

由于guthub问题

Lombok @Builder主要用于不可变的(并使用Collections.unmodifiableList或Guava的ImmutableList

这就是你的原因 UnsupportedOperationException

为了更加确定,请复制完整的代码模式,请您有异常.


Mis*_*dai 5

尝试这个:

@Builder
@Data @AllArgsConstructor
public class ScreenDefinitionDTO {
    @Builder.Default
    private List<ScreenDeclaration> screens = new ArrayList<>();
}
Run Code Online (Sandbox Code Playgroud)

通过这种方式,您可以告诉 lombok 在构建时使用screens空的ArrayList.