如何通过Builder模式强制执行设置参数的顺序

时间:2019-01-01 09:32:44

标签: java builder-pattern

最近,在一次采访中,有人问我如何实施“构建器模式”,即除非设置了参数A,否则用户无法设置参数B。

我建议在构建Builder时将A作为必需参数传递,但是他对我的回答不满意。 我还建议如果在设置B时未设置A,则抛出IllegelStateException,但同样他不满意。 谁能建议我们如何在用户设置B之前强制用户设置A?

class Example{
private int A;
private int B;

public static class Builder{
}

}

2 个答案:

答案 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);
}