如何使用强制变量强制实例化不可变的 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()
方法。
也就是说:你真的需要在编译时检查这个吗?这是一个非常边际收益的大量额外代码。
问题陈述
我想强制执行这样一种情况,即每当创建不可变 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()
方法。
也就是说:你真的需要在编译时检查这个吗?这是一个非常边际收益的大量额外代码。