Мне нужно реализовать singleton MyClass
в kotlin.
Требования:
SuperClass
и мне нужно вызвать конструктор Superclass
MyClass
и понадобиться контекст для вызова конструктора Superclass
. 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) } }
Заметки:
class
вместо object
и самостоятельно управлять текущим экземпляром. Вы также должны сделать это, если вам нужно передать параметры в суперкласс вашего синглтона. getInstance(context)
, это отличная идея лениво тяжелые объекты в вашем одиночном объекте. Для этого вам не нужны никакие объекты или объекты-компаньоны. Это синтаксис для вызова конструктора суперкласса в Котлине:
class MyClass(context: Context) : SuperClass(context)