Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java UnsupportedOperationException与Lombok Builder注释一起引发_Java_List_Runtimeexception_Lombok_Builder Pattern - Fatal编程技术网

Java UnsupportedOperationException与Lombok Builder注释一起引发

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

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

@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<>();
}