我需要在kotlin中实现单例MyClass
。
要求:
SuperClass
,我需要调用Superclass
的构造函数MyClass
并需要上下文来调用Superclass
的构造函数。MyClass
是单身人士。Java等价物:
class MyClass extends SuperClass
{
// instance variable
// getInstance() method
MyClass(Context context)
{
super(context);
}
}
我试图用object
来解决这个问题,但没有让它发挥作用。
有没有办法让它与对象一起使用,还是我必须使用companion object
?
答案 0 :(得分:2)
考虑以下超类:
open class MySuperClass(val context: Context) {...}
由于Kotlin对象只有一个空构造函数,因此需要一个类似于以下内容的结构:
// Private constructor is only accessible within the class.
class MySingleton private constructor(context: Context) : MySuperClass(context) {
companion object {
lateinit var INSTANCE: MySingleton
// Instance setter is only accessible from within the class.
private set
// Custom init function is called from outside and replaces
// THE WHOLE SINGLETON with a new instance
// to avoid internal dependencies on the old context.
fun init(context: Context) {
INSTANCE = MySingleton(context.applicationContext)
}
}
// Lazily initialized field dependent on a Context instance.
val prefs by lazy { PreferenceManager.getDefaultSharedPreferences(context) }
}
在使用单身人士课程之前,您需要拨打init(context)
一次,Application
是一个很好的选择。每次Instant Run加载一个新的Application
对象时,这也会创建一个新的单例实例,这样你总能得到最新的应用程序上下文。
class MyApplication : Application() {
override fun onCreate() {
super.onCreate()
// Eagerly initialized singleton.
MySingleton.init(this)
}
}
注意:
class
而不是object
并自行管理当前实例。如果需要将参数传递给单例的超类,则还必须执行此操作。getInstance(context)
的第一次调用时, lazily 重物是个好主意在你的单身对象中。答案 1 :(得分:0)
您不需要任何对象或伴侣对象来实现此目的。这是在Kotlin中调用超类构造函数的语法:
class MyClass(context: Context) : SuperClass(context)