当生成器本身不继承时,使用生成的继承类的生成器

时间:2018-11-28 23:40:42

标签: java generics inheritance builder generated-code

我正在使用的自动映射器AutoMatter允许继承例如

@AutoMatter
public interface BaseClass {
  Foo foo();
  Bar bar();
}

@AutoMatter
public interface DerivedClass extends BaseClass {
  Baz baz();
}

,但其生成的生成器不是多态的,即

@Generated("io.norberg.automatter.processor.AutoMatterProcessor")
public final class DerivedClassBuilder {

  private Foo foo;
  private Bar bar;
  private Baz baz;

  public DerivedClassBuilder() {}

  private DerivedClassBuilder(DerivedClass v) {
    this.foo = v.foo();
    this.bar = v.bar();
    this.baz = v.baz();
  }

  private DerivedClassBuilder(DerivedClassBuilder v) {
    this.foo = v.foo;
    this.bar = v.bar;
    this.baz = v.baz;
  }

  // (getters and setters for the builder)

  public DerivedClass build() {
      // ...
  }

  public DerivedClassBuilder from(DerivedClass v) {
    return new DerivedClassBuilder(v);
  }

  public DerivedClassBuilder from(DerivedClassBuilder v) {
    return new DerivedClassBuilder(v);
  }

  // a few more things like hash(), equals(), etc.
}

我需要但不存在的东西

public DerivedClassBuilder from(BaseClass v) {
  // ...
}

这意味着,例如,如果我在基类中有许多公共字段,但是有几个不同的派生类,则我必须在某个时候手动构建所有公共字段,例如 eg

DerivedClassBuilder builder = new DerivedClassBuilder();
builder.foo(foo);
builder.bar(bar);
builder.baz(baz);

无法做到

DerivedClassBuilder builder = new DerivedClassBuilder(baseClassBuilder);
builder.baz(baz);

...从一开始就破坏了继承的目的。

如果我被限制使用该库,是否有一种模式可以帮助我对此位进行泛化?

我一直在尝试在基本接口中添加静态助手方法,使用泛型尝试表示任何派生类,但是由于类型擦除,我似乎陷入了困境。即使我尝试使用像Dozer这样的复制相交库,也没有derivedClass.BuilderType可以帮助我。

诚然,我是Java的新手,所以我认为我遗漏了一些显而易见的东西,或者鉴于给定的构建器彼此之间没有任何关系,根本不可能做我想做的事。

0 个答案:

没有答案