自从阅读 Effective Java 以来,这是我一直在使用的一个很好的习惯用法。我一直在努力寻找 C++ 等价物或类似的东西,但运气不佳。 GoF 书中的传统构建器模式并不适用于我的情况。这是一个具有非常困惑的构造函数的复杂对象。下面是 Java 的一个小实现。
class ComplicatedObject {
private String field1;
private String field2;
private int field3;
private ComplicatedObject(Builder builder) {
this.field1 = builder.myField1;
this.field2 = builder.myField2;
this.field3 = builder.myField3;
}
public static class Builder {
private String myField1 = "some default";
private String myField2 = "some other default";
private int myField3 = -1;
public Builder() { }
public Builder field1(String val) {
this.myField1 = val;
return this;
}
public Builder field2(String val) {
this.myField2 = val;
return this;
}
public Builder field3(int val) {
this.myField3 = val;
return this;
}
public ComplicatedObject build() {
return new ComplicatedObject(this);
}
}
public static void main(final String[] args) {
//built like this
ComplicatedObject obj = new ComplicatedObject.Builder().field1("blah").field2("lol").field3(4).build();
}
}
最佳答案
它不仅可以适应 C++,而且这个习语是从 C++ 改编而来的。
我想我第一次听说这个习语是在 Java 出现之前。 IIRC Bjarne Stroustrup 在 C++ 第二版中提到了这一点,作为对为什么 C++ 不需要 Smalltalk 风格命名参数的解释。
我的日期可能有误,但这在 C++ 中已经有 15 年了。
编辑:它似乎首先在 C++ 的设计和演化 (6.5.1) 中被描述,在那里它被称为命名函数参数
关于java - c++ 中有效的 java builder 习语等价物?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7520250/