java - 在扩展类上使用 Builder 构造函数?

标签 java generics constructor effective-java javabuilders

我正在实现一个 Builder 构造函数,如 Joshua Bloch 的“Effective Java 2nd Edition”中所述。但是,当我尝试扩展该类及其构建器时,我遇到了一些复杂情况。本质上,扩展的 Builder 在扩展子类具有返回父构建器类型而不是子构建器类型的设置字段方法。

当然,我可以转换回属性构建链中的 ChildBuilder(如我的主要方法所示),但它不是无缝的,这违背了 Builder 的目的,而且它还迫使我隔离父 setter 和 child 二传手。

我尝试使用泛型,但它最终变得比转换更冗长。

有没有一种方法可以使构建器上的 set 方法始终返回实际实例化的构建器类型?

public class ParentObj {

    public static void main(String[] args) { 

    ChildObj childObj = ((ChildObj.ChildBuilder) (new ChildObj.ChildBuilder())
                .prop1(11)
                .prop2(21)
                .prop3(14))
                .prop4(12)
                .prop5(33)
                .build();
    }



    private int prop1;
    private int prop2;
    private int prop3;

    protected ParentObj(Builder builder) {
        this.prop1 = builder.prop1;
        this.prop2 = builder.prop2;
        this.prop3 = builder.prop3;
    }

    public class Builder { 
        private int prop1;
        private int prop2;
        private int prop3;
        public Builder prop1(int prop1) { this.prop1 = prop1; return this; } 
        public Builder prop2(int prop2) { this.prop2 = prop2; return this; } 
        public Builder prop3(int prop3) { this.prop3 = prop3; return this; } 

        public ParentObj build()
        {
            return new ParentObj(this);
        }
    }

    }

    private class ChildObj extends ParentObj { 

    private final int prop4;
    private final int prop5;

    private ChildObj(ChildBuilder childBuilder) {
        super(childBuilder);

    }

    public class ChildBuilder extends Builder {
        private int prop4;
        private int prop5; 
        public ChildBuilder prop4(int prop4) { this.prop4 = prop4; return this; } 
        public ChildBuilder prop5(int prop5) { this.prop5 = prop5; return this; } 

        public ChildObj build()  { 
            return new ChildObj(this);
        }
    }
}

最佳答案

最好的方法可能是重写父构建器方法。

class ChildBuilder {
  public ChildBuilder prop1(int prop1){ 
    return (ChildBuilder) super.prop1(prop1);
  }
}

虽然这不是很干净,但它适用于您正在尝试做的事情。

关于java - 在扩展类上使用 Builder 构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24000900/

相关文章:

java - JSONObject 到 Java 表示

java - 在 IF 语句中比较 JPasswordfield 和 JTextField 继续执行 else 语句

c# - 通用 lambda 方法签名

java - 在 Java 中,为什么在运行时没有泛型类型信息?

c++ - 派生类构造函数内部如何调用基类构造函数

java - 从网络摄像头保存图像

java - ObjectMapper 转换为 arraylist 不保留顺序

c# - 为什么 IsGenericType 的结果在这些示例中不同?

c++ - "new int[8]()"是否等同于 C++11 中的 "new int[8]{}"?

C++ 复制构造函数行为