如何使用强制变量强制实例化不可变的 pojo?

How to Enforce instantiation of immutable pojo with mandatory variables?

问题陈述

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

假设我有这样的 Pojo

public class pojo {
    private final String str;
    private int number;
}

现在,正如我所说的 pojo 是不可变的,我正在使用 Lombok 的生成器和 Getter 注释。 像,

@Getter
@Builder
public class pojo {
    private final String str;
    private int number;
}

现在,在这个 pojo 中,变量 str 是强制性的,任何没有有效 str 值的 class pojo 实例都不是必需的。

现在,class Pojo的Object可以这样使用Builder构建

pojo obj = pojo.builder().build();

但是字段 str 是强制性的,上面的语句将创建一个 str = null 和 number = 0 的对象。现在我可以使用 @NonNull str 以确保如果有人试图在不指定 str 的情况下构建 pojo 的对象,对象创建将在运行时抛出空指针异常。 但我想在编译时强制执行此检查,如果未将 str 作为参数提供,是否有办法停止对象创建?

如果您手动编写构建器,则可以做到这一点。让你的 builder() 工厂方法 return 像 UnreadyBuilder 那样的 class 没有 build() 方法。然后 UnreadyBuilder 上的 setName() setter(或任何名称)可以 return 一个 ReadyBuilder 对象,它确实有一个 build() 方法。

也就是说:你真的需要在编译时检查这个吗?这是一个非常边际收益的大量额外代码。