Использование сгенерированных компоновщиков унаследованных классов, когда сами компоновщики не наследуют - PullRequest
0 голосов
/ 29 ноября 2018

Используемый мной автомаппер, 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) {
  // ...
}

Это означает, например, если у меня много общих полей в базовом классе, нонесколько различных производных классов, мне нужно в какой-то момент построить все общие поля вручную например

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

вместо того, чтобы делать

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

.... что, в первую очередь, несколько разрушает цель наследования.

Если я вынужден использовать эту библиотеку, есть ли шаблон, который может помочь мне обобщить этот бит?

Я поиграл с добавлением статического вспомогательного метода в базовый интерфейс, используя обобщенные элементы, чтобы попытаться представить любой производный класс, но я, похоже, застрял из-за стирания типа.И нет ничего лучше, чем derivedClass.BuilderType, чтобы помочь мне, даже если я пытаюсь использовать библиотеку пересекающихся при копировании, например, Dozer.

По общему признанию, я новичок в Java, поэтому я думаю, что либо я упускаю что-то очевидное,или просто невозможно делать то, что я хочу, учитывая строителей, которые не имеют никакого отношения друг к другу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...