web-dev-qa-db-ja.com

ダガー注入がKotlinの「オブジェクト」に対して機能しない

私の短剣の注射がうまくいかなかった理由を解明しようと途方もない時間を費やした後。 Kotlinの「オブジェクト」タイプが問題であることに気付きました。

以下は機能しませんでした。注入された「プロパティ」はnullでした。

object SomeSingleton {

    @Inject
    lateinit var property: Property

    init {
        DaggerGraphController.inject(this)
    }
}

ただし、次のDIDは正常に機能します。

class NotSingleton {

    @Inject
    lateinit var property: Property

    init {
        DaggerGraphController.inject(this)
    }
}

私はグーグルを試しました、私はドキュメントを試しました、しかし私はこれの背後にある理由を特定できませんでした。また、私はこれをJavaで試したことがないことに注意してください。Javaには、とにかく組み込まれたシングルトンの概念がありません。

これはなぜですか? Kotlinシングルトンがメンバーを注入できないのに、通常の非シングルトンクラスはできるのはなぜですか?

21
Nihilanth

Kotlinバイトコードを調べると、記述したコードが次のように翻訳されていることがわかります。

public final class SomeSingleton {
    public static LProperty; property // <- Notice static field here

    public final getProperty()LProperty
    ...

    public final setProperty(LProperty)V
    ...
}

あなたが見ることができるように、実際のフィールドは静的であり、インスタンスの注入には不適格です。あなたは移動しようとするかもしれません@Injectアノテーションをセッターメソッドに追加する:

object SomeSingleton {
    @set:Inject
    lateinit var property: Property
    ...
}
13
SimY4

dagger.Lazy<YourClass>を使用しようとしましたが、機能します

 @set:Inject
lateinit var authClient: dagger.Lazy<PlatformAuthClient>
7

それでも@Singletonオブジェクト定義の上にあるデコレータ。そのデコレータはクラスを「シングルトン」にするわけではなく、Daggerがすべての依存関係を同じ場所で取得するために使用するだけです。

0