2013-05-16 13 views
13

(私はDIを使ってJava EE WebAppsでWeldを使っている経験はあるが)大げさではない。Android Dagger Dependency Injectionがプライベートフィールドで失敗する

私がしようとしているのは、クラスに依存関係を挿入することです。フィールドはプライベートです。

Daggerは、プライベートフィールドに挿入できないという例外をスローします。

その理由は何ですか?それもアンドロイドで、反射を使用してプライベートフィールドに書き込むことが可能であるすべての...

私はプライベート以外に、フィールドの可視性を設定した場合、注射が動作しているようです後

答えて

16

プライベートフィールドの「パッケージを表示する」が常にあなたの望むものとは限りません。 Daggerのドキュメントには、次のような情報があります。

最終フィールドとプライベートメンバーを注入します。最高のパフォーマンスのために ダガーはコードを生成します。この問題を回避するには、コンストラクタ 注入を使用します。ここで

は例です:

private ItemFactoryImpl itemFactory; 
private BuildingFactory buildingFactory; 

@Inject 
public World(ItemFactoryImpl itemFactory, BuildingFactory buildingFactory) { 
    this.itemFactory = itemFactory; 
    this.buildingFactory = buildingFactory; 
} 
+0

入力いただきありがとうございます。コンストラクターインジェクションは、CDIでの作業に慣れていたものです。 –

+7

これは構築可能なタイプで動作しますが、Activity、Application、FragmentなどのAndroid OSタイプはAndroidフレームワーク以外のもので構築されることは意図されていません。これらの場合に必要とされる。しかし、これはコンストラクタを制御できる良いアドバイスです。 –

1

privateを削除して、フィールドの可視性をパッケージフレンドリーに設定するだけです。

ダガーはプライベートフィールドへの注入をサポートしていません。

31

Daggerはプライベートフィールドをサポートすることはできず、リフレクションを避けるためにコード生成アダプターもサポートしています。 Guiceのようなシステムでは、プライベートフィールドをサポートするため、フィールドにアクセスする前にフィールドへのアクセスを反映して変更します。 daggerは、注入するクラスと同じパッケージにInjectAdapterを生成するので、パッケージフレンドリ、保護された、またはパブリックフィールドにアクセスできます。プライベートフィールドにアクセスすることはできません。

ダガーの利点の1つは、反射を避けることです。したがって、フィールドの視認性を回避するために反射を使用することは望ましい機能ではありません。

+0

は私には意味があります。これを正解とマークします。ありがとうございました ! –

+0

いつでも。 :)それも投票してください。 ;) –

関連する問題