Как я могу использовать @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
, Я реализовал это в процессе, чтобы увидеть, как обе автобиблиотеки работают вместе.