Kotlin не имеет модификатора static, а это значит, что мы не можем создавать статические переменные и методы. Хорошо, а как нам тогда создать Singleton в Kotlin?
К счастью, Kotlin object может справиться с этим. Ключевое слово companion object используется для доступа к членам конкретного класса.
class MyClass { companion object Factory { val info = "This is factory" fun getMoreInfo():String { return "This is factory fun" } } } MyClass.info // This is factory MyClass.getMoreInfo() // This is factory fun
Каждая переменная или метод расположенные внутри companion object могут вызываться по имени класса (типа статических). И сейчас мы создадим класс-синглтон с использованием паттерна «ленивая загрузка»:
public class Singleton private constructor() { init { println("This ($this) is a singleton") } private object Holder { val INSTANCE = Singleton() } companion object { val instance: Singleton by lazy { Holder.INSTANCE } } var b:String? = null }
- Приватный конструктор используется для того, чтобы гарантировать, что объект данного класса будет создан только внутри этого класса
- Метод
init
будет вызван при загрузке данного класса, т. е. при первом вызовеSingleton.instance
- Holder object & lazy instance используются для создания единственного экземпляра класса
Пример использования:
var first = Singleton.instance // This is a singleton first.b = "hello singleton" var second = Singleton.instance println(second.b) // hello singleton
Источник: Singleton in Kotlin
Комментарии: