web-dev-qa-db-ja.com

Kotlinシングルトンアプリケーションクラス

だからAndroidアプリケーションクラスをシングルトンにしたい。

このようにする:

_object MyApplication: Application(){}
_

動作しません。次のエラーが実行時にスローされます。

_Java.lang.IllegalAccessException: private com....is not accessible from class Android.app.Instrumentation.
_

これを行うこともできません。

_class MyApp: Application() {

    private val instance_: MyApp

    init{
        instance_ = this
    }

    override fun onCreate() {
        super.onCreate()
        if (BuildConfig.DEBUG) {
            Timber.plant(Timber.DebugTree());
        }
    }

    companion object{
        fun getInstance() = instance_         
    }
}
_

それで、アプリのあらゆる場所でアプリケーションクラスのインスタンスを取得するには、_(applicationContext as MyApp)_の代わりにMyApp.instance()を使用したいと思います。

また、これが必要な理由の説明:アプリにクラスがあります。たとえば、コンテキストで初期化され、そのシングルトンとして引数を持つことができないSharedPreferenceシングルトンです。

35
johnny_crq

静的プロパティにアクセスするために使用必要な場合:アプリケーションのインスタンスは1つだけなので、クラスに付けた名前を使用します。実際のシングルトンではないことを心配しないでください。同じように使用できます。

例:

class MyApp : Application() {

    companion object {
        const val CONSTANT = 12
        lateinit var typeface: Typeface
    }

    override fun onCreate() {
        super.onCreate()
        typeface = Typeface.createFromAsset(assets, "fonts/myFont.ttf")
    }

}

その後、アプリの任意の場所でMyApp.CONSTANTMyApp.typefaceを使用できます。

-

必要なものがアプリケーションコンテキストとして使用するの場合、Contextの拡張プロパティを作成できます。

val Context.myApp: MyApp
        get() = applicationContext as MyApp

次に、myAppを使用して、コンテキストがある場所であればどこでもアプリケーションコンテキストを取得できます。

33
nitrico

Javaで行うのと同じことを実行できます。つまり、Applicationインスタンスを静的フィールドに配置します。 Kotlinには静的フィールドはありませんが、オブジェクトのプロパティには静的にアクセスできます。

class MyApp: Application() {

    override fun onCreate() {
        super.onCreate()
        instance = this
    }

    companion object {
        lateinit var instance: MyApp
            private set
    }
}

その後、MyApp.instanceを介してプロパティにアクセスできます。

73
Kirill Rakhman
    class AppController : Application() {

        init {
            instance = this
        }

        companion object {
            private var instance: AppController? = null

            fun applicationContext() : AppController {
                return instance as AppController
            }
        }

        override fun onCreate() {
            super.onCreate()
        }
    }
11
Raja Jawahar

Androidはパラメーターなしのコンストラクターを使用してApplicationインスタンスを作成するため、これを行うことはできません。

解決したい問題は、DIで簡単に解決できます。 Contextを依存関係としてオブジェクトに注入できるように、インジェクターでインスタンスを作成するだけです。

3
Michael