Clase de aplicación Kotlin SingleTon

Entonces, en Android quiero hacer que mi class de aplicación sea singleton.

Haciéndolo así:

object MyApplication: Application(){} 

no funcionará Después de erros se lanza en time de ejecución:

 java.lang.IllegalAccessException: private com....is not accessible from class android.app.Instrumentation. 

Hacer esto tampoco es posible:

 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_ } } 

Entonces, ¿cómo puedo get una instancia de mi class de aplicación en todas partes en mi aplicación, me gustaría usar MyApp.instance() lugar de (applicationContext as MyApp) .

También una explicación de por qué quiero esto: tengo classs en mi aplicación, por ejemplo, ShanetworkingPreference Singleton que se inicializa con un context, y como es un singleton, no puede tener arguments.

Si desea usarlo para acceder a algunas properties estáticas que tiene allí: solo tendrá una instancia de su Aplicación, así que simplemente use el nombre que le dio a la class. No se preocupe porque no sea un singleton real, puede usarlo de la misma manera.

Ejemplo:

 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") } } 

Luego puede usar MyApp.CONSTANT y MyApp.typeface en cualquier lugar de su aplicación.

Si lo que desea es usarlo como context de la aplicación , puede crear una propiedad de extensión para Context:

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

Entonces podrá usar myApp para get el context de la aplicación en cualquier lugar donde tenga context.

Puede hacer lo mismo que haría en Java, es decir, colocar la instancia de la Application en un campo estático. Kotlin no tiene campos estáticos, pero las properties en los objects son estáticamente accesibles.

 class MyApp: Application() { override fun onCreate() { super.onCreate() instance = this } companion object { lateinit var instance: MyApp private set } } 

A continuación, puede acceder a la propiedad a través de MyApp.instance .

No puede hacer eso porque Android crea una instancia de Application utilizando su constructor sin parameters.

El problema que quiere resolver se puede resolver fácilmente con DI. Simplemente cree instancias con un inyector para que el Context pueda ser inyectado en objects como una dependencia.