这是自从阅读《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++,而且习惯用法也已适应from C++.
我想我第一次听说这个习语是在 Java 出现之前。 IIRC Bjarne Stroustrup 在 C++ 第二版中提到了这一点,作为 C++ 不需要 Smalltalk 风格命名参数的解释。
我的日期可能有误,但这在 C++ 中已经有 15 年的历史了。
编辑:似乎它首先被描述于C++的设计和演变(6.5.1) 被调用的地方命名函数参数
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)