我想象的解决方案就像是
好奇地重复使用的模板模式
或 CRTP
。您可以定义一个基类来处理与父相关的初始化,但是您仍然可能会发现两个样板
getParent()和
getThis()方法在每个派生的与子相关的构建器类中重复太多。
看一看:
abstract class Parentbase implements Parent{ @Override public final Long getParentProperty() { return parentProperty_; } protected void setParentProperty(Long value) { parentProperty_ = value; } private Long parentProperty_;}abstract class ParentBuilder<T extends ParentBuilder<T>>{ T withParentProperty(Long value) { getParent().setParentProperty(value); return getThis(); } protected abstract Parentbase getParent(); protected abstract T getThis();}final class ConcreteChild1 extends Parentbase implements Child1{ @Override public Integer getChild1Property() { return childProperty_; } public void setChild1Property(Integer value) { childProperty_ = value; } private Integer childProperty_;}final class Child1Builder extends ParentBuilder<Child1Builder>{ public Child1Builder() { pending_ = new ConcreteChild1(); } public Child1Builder withChild1Property(Integer value) { pending_.setChild1Property(value); return this; } @Override protected Parentbase getParent() { return pending_; } @Override protected Child1Builder getThis() { return this; } private final ConcreteChild1 pending_;}如您所见,该
ParentBuilder类型期望与派生类型配合使用,以允许它返回正确类型的实例。自己的
this参考不会到期,因为类型
this之内
ParentBuilder,当然,
ParentBuilder而不是,比方说,
Child1Builder如预期维持“流利”的呼叫链接。
我欠了“
getThis()帽子戏法”,以安格朗格的入门教程。



