Как я могу использовать @AutoFactory с классом @AutoValue?

Скажем, у меня есть простой класс AutoValue:

@AutoValue abstract class Foo {
  abstract CommonDependency commonDep();
  abstract String uniqueDataPerInstance();

  static Foo create(CommonDependency commonDep, String data) {
    return new AutoValue_Foo(commonDep, data);
  }
}

Теперь я хочу фабрику, поэтому мне не нужно проходить commonDep каждый раз, когда я хочу Foo. Если бы это был не класс AutoValue, я мог бы использовать AutoFactory для этого тривиально, пометив CommonDependency @Provided,

Знаете ли вы, как заставить эти два генератора кода хорошо работать вместе?

1 ответ

Решение

Это действительно довольно интересная проблема, так как @AutoFactory аннотация может применяться только к неабстрактным классам.

ошибка: авто-фабрика не поддерживает применение к абстрактным классам.

Для аннотированных конструкторов не было даже полезного сообщения об ошибке после сбоя компилятора.

Так как есть только abstract или же final классы с автоматическими значениями в процессе генерации кода, мы должны аннотировать последний и последний класс. Чтобы сделать это, вам нужно реализовать расширение для автоматического значения, которое mustBeFinal() и аннотирует объявление класса или конструктор конечного класса с @AutoFactory аннотаций.

Вот еще одна проблема, вступающая в силу, потому что параметры конструктора должны быть соответствующим образом аннотированы. Так @Provided, @Nullable или любой @Qualifier там нужно добавить аннотацию. Самая большая проблема здесь в том, что @Provided определяет @Target(PARAMETER) а с помощью auto-value мы определяем только методы.

Если вы не хотите реализовывать это самостоятельно, вы можете попробовать использовать auto-value-factory, Я реализовал это в процессе, чтобы увидеть, как обе автобиблиотеки работают вместе.

Другие вопросы по тегам