UnsupportedOperationException 与 Lombok Builder 注释一起抛出



我正在使用龙目岛进行我的项目。 我的模型如下所示:

@Builder
@Data @AllArgsConstructor
public class ScreenDefinitionDTO {
@Singular
private List<ScreenDeclaration> screens;
}

我想做下一个操作:

String screenName = ctx.screenName().getText();
ScreenDeclaration declaration = ParsingUtils
.buildScreenDeclaration(StringUtils.trim(screenName));

创建实例的位置:

public static ScreenDefinitionDTO buildEmptyScreenDTO() {
return ScreenDefinitionDTO.builder()
.screens(new ArrayList<>())
.build();
}

最后,我得到了:

Exception in thread "main" java.lang.UnsupportedOperationException
at java.util.AbstractList.add(AbstractList.java:148)
at java.util.AbstractList.add(AbstractList.java:108)

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

public static ScreenDefinitionDTO buildEmptyScreenDTO() {
return new ScreenDefinitionDTO(new ArrayList<>());
}

我不明白龙目岛的构建器模式有什么问题?

由于 GitHub 问题

龙目岛@Builder主要用于不可变(并使用 Collections.unmodifiableList 或 Guava's ImmutableList

这就是为什么你有UnsupportedOperationException

为了更加确定,请在有异常的地方重现完整的代码模式。

试试这个:

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

通过这种方式,您告诉龙目岛在构建时用空ArrayList初始化screens

如@fbokovikov所述,@Builder注释使用不可变的,因此当您尝试在列表中添加元素时,会抛出异常。

dto.getScreens().add(new ScreenDeclaration()) // throws java.lang.UnsupportedOperationException

如果设置断点以查看dto.getScreens()返回的值,则可以看到其类型为Collections$EmptyList。如果使用 DTO 的构造函数,则类型ArrayList,并且不会引发异常。

最新更新