builder模式,无需重写所有常用方法

rn0zuynd  于 2021-07-09  发布在  Java
关注(0)|答案(1)|浏览(330)

我试图创建不同类型的构建器,每种构建器都有共同和独特的方法,因此我试图为它创建某种抽象,但是我遇到了一个问题。
我的代码示例如下:

// The abstract with all the common methods
public abstract class AbstractBuilder {

    public AbstractBuilder commonMethod() { 
        // implementation here
        return this;
    }

}

// Builder 1
public class MainBuilder extends AbstractBuilder {

    public MainBuilder mainUniqueMethod() {
        // implementation here
        return this;
    }

}

// Builder 2
public class SecondBuilder extends AbstractBuilder {

    public SecondBuilder secondUniqueMethod() {
        // implementation here
        return this;
    }

}

这个问题会在与建设者合作时出现,假设我是这样做的

new MainBuilder().mainUniqueMethod().commonMethod(); // Possible
new MainBuilder().commonMethod().mainUniqueMethod(); // Impossible because commonMethod returns `AbstractBuilder`

因此,我发现解决此问题的唯一方法是始终重写,然后对main方法强制执行超级调用,如:

@Override
public MainBuilder commonMethod() {
    return (MainBuilder) super.commonMethod();
}

但是如果常用的方法足够大的话,这可能会变得非常重复,也许这是一个糟糕的设计,但是我想知道是否有更有效的方法来实现这一点。

mi7gmzs6

mi7gmzs61#

您可以在这里使用泛型:

public abstract class AbstractBuilder<T extends AbstractBuilder<T>> {

  public T commonMethod() { 
    // implementation here
    return getThis();
  }

  @SuppressWarnings("unchecked")
  protected T getThis() {
    return (T)this;
  }
}

class MainBuilder extends AbstractBuilder<MainBuilder> { ... }

这样公共基类就可以“知道”实际返回的子类型。这个 getThis() 方法需要一个丑陋的演员阵容,如果你使用类似 class SecondBuilder extends AbstractBuilder<MainBuilder> 因此发出警告。所以要注意如何实现子类。
解决这个问题的一个方法是 getThis() 抽象并让每个子类实现它。

相关问题