32

私は自分のプロジェクトでダガーを立ち上げようとしています。

ただし、コンパイル中にクラスの 1 つで次の例外が発生します。

エラー: Foo に注入可能なメンバーがありません。注入可能なコンストラクターを追加しますか?

ただし、クラスには依存関係がないため、デフォルトの引数なしコンストラクターを使用します。

public class Foo
{
    ...
}

以下のような注入可能な引数なしのコンストラクターを本当に追加する必要がありますか?

public class Foo
{
     @Inject
     public Foo()
     {
     }

     ....
}
4

1 に答える 1

41

ドキュメントから:

@Inject アノテーションがないクラスは、Dagger で構築できません。

Dagger では、引数なしのコンストラクターを追加するか、注入可能なフィールドを追加することにより、注入可能なクラスに @Inject を追加することが積極的に要求されます。3 番目のオプションは、次のように @Provides メソッドからクラスを返すことです。

@Module(...)
class MyModule {
  @Provides Foo provideFoo() {
    return new Foo(); // Foo is not injectable.
  }
}

これは余分な決まり文句のように思えますが、Guice やその他のフレームワークでの経験から、ランダムなクラスの JIT バインディングはエラーに満ちていることがわかりました。java.lang.String がインジェクトされるのを見てきましたが、誰かがそれをバインドするのを忘れたため、目的の文字列の代わりに "" がインジェクトされてしまいました。したがって、Dagger には @Inject コンストラクターまたはフィールドが必要です。

これは、Dagger が多少の冗長性を犠牲にして、より正確性の保証を選択したまれな例です。

于 2013-08-20T20:43:24.690 に答える