2017-02-02 10 views
2

Скажем, у меня есть простой класс Автозначение:Как я могу использовать @AutoFactory с классом @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 может применяться только к не-абстрактным классам.

error: Auto-factory doesn't support being applied to abstract classes.

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

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

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

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