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

标签 java builder pojo lombok

问题陈述

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

假设我有这样的 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 的任何实例都不是必需的。

现在可以使用Builder这样构造Pojo类的对象了

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

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

最佳答案

如果您手动编写构建器,则可以做到这一点。让您的 builder() 工厂方法返回一个类似 UnreadyBuilder 的类,它没有 build() 方法。然后,UnreadyBuilder 上的 setName() setter(或其他任何名称)可以返回一个 ReadyBuilder 对象,该对象确实具有 build() 方法。

也就是说:你真的需要在编译时检查这个吗?这是大量额外的代码,但带来的好处却微乎其微。

关于java - 如何使用强制变量强制实例化不可变的pojo?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47598800/

相关文章:

java - 如何使用Java Scanner读取非英文字符?

flutter - Flutter-如何使用某种生成器在同一段落中显示具有不同样式的字符串数组?

java - 有类似 "build-once"构建器的东西吗?

java - 无法解析 REST Web 服务中的 JSON

java - 为我的类中使用的通用 pojo 建模

java - 如何在新的play-services-nearby中实现抽象类Endpoint Discovery Listener和Connection RequestListener?

java - 可以在 ReSTLet Java SE 中使用 xml/css/json 吗?

ruby-on-rails - 如何保存 ruby​​ builder 生成的 xml 而不是在 rails 应用程序中呈现它?

java - 从 JSON 数组字符串创建 POJO 对象

java - java中的静态方法main