java - 使用构建器模式扩展类

标签 java oop inheritance builder

我正在尝试将 a 类扩展为 aX。所以,我也扩展了aBuilder。但是,虽然我能够使用以下方法创建类 a 的对象:

aBuilder f = new aBuilder();
f.bi = i;
f.bs = s;
a atry = f.withI(i).withS(s).build();

这对 aX 不起作用。当我尝试这样做时:

aXBuilder fb = new aXBuilder();
aX aXtry = fb.withI(i).withS(s).withB(b).build();

我得到一个错误(方法 withB(Boolean) 未定义类型 a.aBuilder)。 我是否应该重写 aX 的所有内容,而不是简单地添加新内容?我不想那样做,因为那会导致我的代码出现很多重复。类 a 和 aX 如下所示:

class a {

protected String s;
protected int i;

public void getdata() {
    System.out.println(this.s);
    System.out.println(this.i);
}

protected a(aBuilder fb) {
    this.s = fb.bs;
    this.i = fb.bi;
}

public static class aBuilder {
    public aBuilder() {
    }

    protected String bs;
    protected int bi;

    public aBuilder withS(String s) {
        this.bs = s;
        return this;
    }

    public aBuilder withI(Integer i) {
        this.bi = i;
        return this;
    }

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

}

aX 类扩展了一个 {

protected Boolean b;

public void getData()
{
    System.out.println(this.s);
    System.out.println(this.i);
    System.out.println(this.b);
}

protected aX(aXBuilder axb) {
    super(axb);
    this.b = axb.bb;
}

public static class aXBuilder extends aBuilder {
    protected Boolean bb;

    public aXBuilder() {
    }

    public aXBuilder withB(Boolean b) {
        this.bb = b;
        return this;
    };

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

最佳答案

您可以使用泛型解决您的问题,尽管它确实需要创建一个抽象父类(super class)。潜伏在这个网站上告诉我,从具体类继承被广泛认为是邪恶的。

public abstract class AbstractA {
    protected String s;
    protected int i;
    protected AbstractA() {
    }
    protected abstract static class ABuilder<T extends AbstractA, B extends ABuilder<T,B>> {
        protected T object;
        protected B thisObject;
        protected abstract T getObject(); //Each concrete implementing subclass overrides this so that T becomes an object of the concrete subclass
        protected abstract B thisObject(); //Each concrete implementing subclass builder overrides this for the same reason, but for B for the builder
        protected ABuilder() {
            object = getObject();
            thisObject = thisObject();
        }
        public B withS(String s) {
            object.s = s;
            return thisObject;
        }
        public B withI(int i) {
            object.i = i;
            return thisObject;
        }
        public T build() {
            return object;
        }
    }
}

将抽象类放在一起后,您只需根据需要多次扩展它,重写构建器中的抽象方法以返回您需要的对象类型。

public final class ConcreteA extends AbstractA {
    private String foo;
    protected ConcreteA() {
    }
    public static final class Builder extends AbstractA.ABuilder<ConcreteA,Builder> {
        @Override protected ConcreteA getObject() {
            return new ConcreteA();
        }
        @Override protected Builder thisObject() {
            return this;
        }
        public Builder() {
        }
        public Builder withFoo(String foo) {
            object.foo = foo;
            return this;
        }
    }
}

然后…… ConcreteA baz = new ConcreteA.Builder().withFoo("foo").withS("bar").withI(0).build();

关于java - 使用构建器模式扩展类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24243240/

相关文章:

java - 线程转储显示线程未释放锁。

java 8 过滤一个 ListOfMap 用于检查一个键是否存在,如果存在则收集一个映射

php - 如何在 Laravel Controller 中使用方法重载?

python - 使用类继承时出现类型错误

objective-c - 如何在 Swift 中更改覆盖函数返回类型

java - 如何在用户单击 JTextField 时删除文本?

java - 如何捕获 JMS 连接建立的时间?

PHP将一个类的实例传递给另一个类

php - 如何在 PHP 中设计一个对象

python - 如何继承multiprocessing.Pipe?