最近,在一次采访中,有人问我如何实施“构建器模式”,即除非设置了参数A,否则用户无法设置参数B。
我建议在构建Builder时将A作为必需参数传递,但是他对我的回答不满意。 我还建议如果在设置B时未设置A,则抛出IllegelStateException,但同样他不满意。 谁能建议我们如何在用户设置B之前强制用户设置A?
class Example{
private int A;
private int B;
public static class Builder{
}
}
答案 0 :(得分:1)
要在纯Java中执行此操作,您需要创建单独的Builder类,第一个用于设置A,然后返回的值是第二个Builder的实例,该实例用于设置B。
此方法的局限性在于它非常冗长,并且不能很好地扩展到具有许多可选参数的位置。
或者,我通过编写一个编译器插件(我使用Error Prone来做到这一点,因为它最容易与Google的构建系统一起使用,但是没有理由不能使用其他工具)来检查方法调用顺序。
答案 1 :(得分:0)
主要思想是在setA
setB
方法中使用不同的返回类型,但是这些类型必须与构建器类型相同或相同。
public class ExampleBuilderImpl implements FullExampleBuilder {
private int a;
private int b;
public Example createExample() {
return new Example(a, b);
}
@Override
public PartExampleBuilder setB(int b) {
this.b = b;
return this;
}
@Override
public FullExampleBuilder setA(int a) {
this.a = a;
return this;
}
public static void main(String[] args) {
ExampleBuilderImpl builder = new ExampleBuilderImpl();
// compiler error
// builder.setB(1).setA();
builder.setA(1).setB(2);
}
}
public interface FullExampleBuilder extends PartExampleBuilder {
FullExampleBuilder setA(int a);
}
public interface PartExampleBuilder {
PartExampleBuilder setB(int b);
}