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

时间:2017-12-01 17:46:43

标签: 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的对象,则确保Object创建在运行时抛出Null指针Exception。 但是我想在编译时强制执行此检查,如果str没有作为参数给出,是否有办法停止对象创建?

1 个答案:

答案 0 :(得分:2)

如果您手动编写Builder,则可以执行此操作。让您的builder()工厂方法返回类似UnreadyBuilder的类,该类没有build()方法。然后,setName()上的UnreadyBuilder设置器(或其所谓的任何设置器)可以返回ReadyBuilder对象,该对象具有build()方法。

那说:你真的需要在编译时检查这个吗?它带来了很多额外的代码,可以带来非常小的好处。