2017-02-02 3 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); 
    } 
} 

今、私は工場をしたいので、私は、私はFooのが欲しいcommonDepたびに渡す必要はありません。これがAutoValueクラスでない場合は、CommonDependency @Providedに注釈を付けることで、このためにAutoFactoryを簡単に使用できます。

これらの2つのコードジェネレータをうまく連携させる方法を知っていますか?

答えて

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を試してみてください。私は、両方の自動ライブラリがどのように連携しているかを見るためのプロセスで実装しました。

関連する問題