Java UnsupportedOperationException与Lombok Builder注释一起引发
我正在使用Lombok进行我的项目。 我的模型看起来像:Java UnsupportedOperationException与Lombok Builder注释一起引发,java,list,runtimeexception,lombok,builder-pattern,Java,List,Runtimeexception,Lombok,Builder Pattern,我正在使用Lombok进行我的项目。 我的模型看起来像: @Builder @Data @AllArgsConstructor public class ScreenDefinitionDTO { @Singular private List<ScreenDeclaration> screens; } 创建实例的位置: public static ScreenDefinitionDTO buildEmptyScreenDTO() { return Scree
@Builder
@Data @AllArgsConstructor
public class ScreenDefinitionDTO {
@Singular
private List<ScreenDeclaration> screens;
}
创建实例的位置:
public static ScreenDefinitionDTO buildEmptyScreenDTO() {
return ScreenDefinitionDTO.builder()
.screens(new ArrayList<>())
.build();
}
当我更改创建实例时,没有Lombok builder模式,一切都很好:
public static ScreenDefinitionDTO buildEmptyScreenDTO() {
return new ScreenDefinitionDTO(new ArrayList<>());
}
buildEmptyScreenDTO()的公共静态屏幕定义{
将新的ScreenDefinitionDTO返回(new ArrayList());
}
我不明白龙目巨人的建筑模式出了什么问题?由于
Lombok@Builder
主要用于不可变(并且使用
Collections.unmodifiableList或番石榴的ImmutableList
这就是为什么您有UnsupportedOperationException
为了获得更大的确定性,请在出现异常的地方复制完整的代码模式。正如@fbokovikov所说,
@Builder
注释使用不可变项,因此当您尝试在列表中添加元素时,会引发异常
dto.getScreens().add(new ScreenDeclaration()) // throws java.lang.UnsupportedOperationException
如果设置断点以查看dto.getScreens()
返回的值,则可以看到其类型为Collections$EmptyList
。如果使用dto的构造函数,则类型为ArrayList
,并且不会引发异常。尝试以下操作:
@Builder
@Data @AllArgsConstructor
public class ScreenDefinitionDTO {
@Builder.Default
private List<ScreenDeclaration> screens = new ArrayList<>();
}
@Builder
@数据@AllArgsConstructor
公共类屏幕定义到{
@Builder.Default
私有列表屏幕=新的ArrayList();
}
通过这种方式,您告诉lombok在构建时,使用空的
数组列表初始化屏幕
是否存在任何解决方法?跳过lombok的构建器是可行的,但是,它不是那么方便。@nazar_art AFAIK不,但是使用不可变对象怎么样?有时,这是个坏主意,但有时,它不是。没有s也toBuilder
(如果在@Builder
注释中允许),这又给了您一个可变对象。我敢打赌,堆栈跟踪中还有更多内容。类似于Collection$UnmodifiableList
或类似的东西,从某种程度上解释了这一点。@maaartinus我没有看到与这种输出相关的任何内容。我错了。我配置了lombok.singular.useGuava=true
并获取java.lang.unuppercom.google.common.collect.ImmutableCollection.add(ImmutableCollection.java:221)
,但是Collections
仅仅依赖于继承抛出方法。您是如何解决这个问题的?我得到了Singular.Default无法解析为类型
对不起,我输入了“Singular”。正确的是“Builder”,就像现在一样。
dto.getScreens().add(new ScreenDeclaration()) // throws java.lang.UnsupportedOperationException
@Builder
@Data @AllArgsConstructor
public class ScreenDefinitionDTO {
@Builder.Default
private List<ScreenDeclaration> screens = new ArrayList<>();
}