Java 如何使用强制变量强制执行不可变pojo的实例化? 问题陈述

Java 如何使用强制变量强制执行不可变pojo的实例化? 问题陈述,java,builder,pojo,lombok,Java,Builder,Pojo,Lombok,我想强制执行这样一种情况,即无论何时创建不可变pojo的实例,所有必需变量都必须作为参数传入 让我们假设我有这样的波乔 public class pojo { private final String str; private int number; } 现在,正如我所说的pojo是不可变的,我正在使用Lombok的Builder和Getter注释。 大概 @Getter @Builder public class pojo { private final String

我想强制执行这样一种情况,即无论何时创建不可变pojo的实例,所有必需变量都必须作为参数传入

让我们假设我有这样的波乔

public class pojo {
    private final String str;
    private int number;
}
现在,正如我所说的pojo是不可变的,我正在使用Lombok的Builder和Getter注释。 大概

@Getter
@Builder
public class pojo {
    private final String str;
    private int number;
}
现在,在这个pojo中,变量str是必需的,没有有效值str的任何pojo类实例都是不需要的

现在,类Pojo的对象可以使用生成器以这种方式构造

pojo obj = pojo.builder().build();
但是字段str是必需的,上面的语句将创建str=null,number=0的对象。现在我可以使用@NonNull over str,以确保如果有人试图在未指定str的情况下构建pojo的对象,则对象创建在运行时引发空指针异常。
但我想在编译时强制执行此检查,如果str不是作为参数给定的,是否有方法停止对象创建?

如果手工编写生成器,则可以执行此操作。让您的
builder()
工厂方法返回一个类,如
UnreadyBuilder
,它没有
build()
方法。然后
UnreadyBuilder
上的
setName()
setter(或任何调用)可以返回一个
ReadyBuilder
对象,该对象具有
build()
方法


也就是说:您真的需要在编译时检查它吗?这是一个相当小的好处很多额外的代码

如果您手工编写生成器,就可以做到这一点。让您的
builder()
工厂方法返回一个类,如
UnreadyBuilder
,它没有
build()
方法。然后
UnreadyBuilder
上的
setName()
setter(或任何调用)可以返回一个
ReadyBuilder
对象,该对象具有
build()
方法


也就是说:您真的需要在编译时检查它吗?这是一个相当小的好处很多额外的代码

当使用
@Builder
时,您不能在编译时强制执行该操作。当使用
@Builder
时,您不能在编译时强制执行该操作。好吧,我认为必须存在一个非常优雅的解决方案来解决此问题,但我想没有。因此,我认为,我应该选择@NonNull@CroskCool,或者放弃
@Builder
,而选择
@allargsconstuctor
。如果您有很多字段,请考虑拆分类。如果你不能,考虑分组字段,这样你就可以做一些事情了,比如<代码>新BigPojo(新的PART1(A,B,C,D),新的PART2(E,F,G))< /代码>。遗憾的是,你必须手工编写构造函数。我认为这个问题一定有一个非常优雅的解决方案,但我想没有。因此,我认为,我应该选择@NonNull@CroskCool,或者放弃
@Builder
,而选择
@allargsconstuctor
。如果您有很多字段,请考虑拆分类。如果你不能,考虑分组字段,这样你就可以做一些事情了,比如<代码>新BigPojo(新的PART1(A,B,C,D),新的PART2(E,F,G))< /代码>。遗憾的是,您必须手工编写构造函数。