Конструктор супертипов объекта Котлин

Мне нужно реализовать singleton MyClass в kotlin.

Требования:

  1. MyClass имеет супертип SuperClass и мне нужно вызвать конструктор Superclass
  2. Мне нужно передать контекст в MyClass и понадобиться контекст для вызова конструктора Superclass .
  3. MyClass – синглтон.

Java-эквивалент:

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

Я пытался решить это с помощью object но не работал.

Есть ли способ заставить его работать с объектом или мне нужно использовать companion object ?

Рассмотрим следующий суперкласс:

 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) вызвать init(context) прежде чем использовать свой класс singleton, и Application – отличное место для этого. Это также создаст новый экземпляр вашего синглтона каждый раз, когда Instant Run загружает новый объект Application поэтому вы всегда получаете самый современный контекст приложения.

 class MyApplication : Application() { override fun onCreate() { super.onCreate() // Eagerly initialized singleton. MySingleton.init(this) } } 

Заметки:

  • Объекты Котлина имеют только пустой конструктор. Если вам нужно инициализировать объект, используйте пользовательскую функцию init.
  • Если ваши поля зависят от контекста, который может измениться, лучше использовать class вместо object и самостоятельно управлять текущим экземпляром. Вы также должны сделать это, если вам нужно передать параметры в суперкласс вашего синглтона.
  • Поскольку вы с нетерпением инициализируете класс в начале вашего приложения (не при первом вызове getInstance(context) , это отличная идея лениво тяжелые объекты в вашем одиночном объекте.
  • Если ваше приложение является многопроцессорным, найдите способ инициализации вашего синглтона только в том процессе, который вы его используете. (Подсказка: ContentProvider создается только в основном процессе по умолчанию.)

Для этого вам не нужны никакие объекты или объекты-компаньоны. Это синтаксис для вызова конструктора суперкласса в Котлине:

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