动机
最近我正在寻找一种初始化复杂对象的方式,而不需要在构造函数中传递大量参数。我尝试使用构建器模式,但我不喜欢这样做的事实是我无法在编译时检查是否真正设置了所有必需的值。
传统的构建器模式
当我使用构建器模式来创建我的Complex
对象时,创建过程更加“类型安全”,因为更容易看到参数的用途:
new ComplexBuilder()
.setFirst( "first" )
.setSecond( "second" )
.setThird( "third" )
...
.build();
但现在我有一个问题,我很容易会错过一个重要的参数。我可以在build()
方法中检查它,但那只能在运行时进行。在编译时,如果我错过了某些内容,没有任何警告可以提醒我。
增强型构建器模式
现在我的想法是创建一个构建器,如果我错过了必需的参数,它可以“提醒”我。我的第一次尝试看起来像这样:
public class Complex {
private String m_first;
private String m_second;
private String m_third;
private Complex() {}
public static class ComplexBuilder {
private Complex m_complex;
public ComplexBuilder() {
m_complex = new Complex();
}
public Builder2 setFirst( String first ) {
m_complex.m_first = first;
return new Builder2();
}
public class Builder2 {
private Builder2() {}
Builder3 setSecond( String second ) {
m_complex.m_second = second;
return new Builder3();
}
}
public class Builder3 {
private Builder3() {}
Builder4 setThird( String third ) {
m_complex.m_third = third;
return new Builder4();
}
}
public class Builder4 {
private Builder4() {}
Complex build() {
return m_complex;
}
}
}
}
正如您所见,生成器类的每个setter方法都返回一个不同的内部生成器类。每个内部生成器类仅提供一个setter方法,最后一个内部生成器类只提供build()方法。
现在对象的构建看起来像这样:
new ComplexBuilder()
.setFirst( "first" )
.setSecond( "second" )
.setThird( "third" )
.build();
...但是没有办法忘记必需的参数,编译器会拒绝它。
可选参数
如果我有可选参数,我将使用最后一个内部构建器类Builder4
来设置它们,就像“传统”的构建器一样,返回自身。
问题
- 这是否是一个众所周知的模式?它有特定的名称吗?
- 您是否看到任何陷阱?
- 您有任何改善实现的想法-以减少代码行数的意义上?