Kotlin SingleTon应用程序类

所以在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_ } } 

那么如何在我的应用程序中的任何地方获取应用程序类的实例,想要使用MyApp.instance()而不是(applicationContext as MyApp)

还解释了为什么我想要这个:我的应用程序中有类,例如,使用上下文初始化的SharedPreference Singleton,并且作为单例,不能有参数。

如果您想使用它来访问某些静态属性 ,那么:您只有一个Application实例,所以只需使用您为该类提供的名称即可。 不要担心它不是一个真正的单身人士,你可以用同样的方式。

例:

 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在具有上下文的任何位置获取应用程序上下文。

您可以在Java中执行相同的操作,即将Application实例放在静态字段中。 Kotlin没有静态字段,但对象中的属性是静态可访问的。

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

然后,您可以通过MyApp.instance访问该属性。

 class AppController : Application() { init { instance = this } companion object { private var instance: AppController? = null fun applicationContext() : AppController { return instance!! } } override fun onCreate() { super.onCreate() } 

你不能这样做,因为Android使用其无参数构造函数创建一个Application实例。

您想要解决的问题可以通过DI轻松解决。 只需使用注入器创建实例,以便可以将Context作为依赖项注入对象。