Kotlin对象超类型构造函数

时间:2017-03-05 17:51:47

标签: java android kotlin

我需要在kotlin中实现单例MyClass

要求:

  1. MyClass有超类型SuperClass,我需要调用Superclass的构造函数
  2. 我需要将上下文传递给MyClass并需要上下文来调用Superclass的构造函数。
  3. MyClass是单身人士。
  4. Java等价物:

    class MyClass extends SuperClass
    {
        // instance variable
        // getInstance() method
        MyClass(Context context)
        {
            super(context);
        }
    }
    

    我试图用object来解决这个问题,但没有让它发挥作用。

    有没有办法让它与对象一起使用,还是我必须使用companion object

2 个答案:

答案 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)
    }
}

注意:

  • Kotlin对象只有一个空构造函数。如果需要初始化对象,请使用自定义初始化函数。
  • 如果您的字段依赖于可能会更改的上下文,则最好使用class而不是object并自行管理当前实例。如果需要将参数传递给单例的超类,则还必须执行此操作。
  • 因为你急切地在应用程序开始时初始化类(而不是在getInstance(context)的第一次调用时, lazily 重物是个好主意在你的单身对象中。
  • 如果您的应用是多进程,那么只有在您实际使用它的过程中才能找到初始化单例的方法。 (提示:默认情况下,ContentProvider仅在主进程中创建。)

答案 1 :(得分:0)

您不需要任何对象或伴侣对象来实现此目的。这是在Kotlin中调用超类构造函数的语法:

class MyClass(context: Context) : SuperClass(context)