Ответ
object Singleton {
init {
println("Singleton initialized")
}
fun doSomething() {
println("Doing something")
}
}
// Использование:
Singleton.doSomething()
Ключевые моменты:
objectв Kotlin автоматически создает thread-safe синглтон с ленивой инициализацией- Инициализация происходит при первом обращении
- Доступ к методам через имя объекта (Singleton.method())
- Для Java-совместимости можно добавить
@JvmStaticаннотации
Ответ 18+ 🔞
А, ну это же классика, ебать мои старые костыли! Смотри, тут про синглтон в Kotlin. Ёпта, это же просто пиздец как удобно, по сравнению с тем, как мы раньше в Java городили.
Вот смотри на этот код. Видишь ключевое слово object? Это оно и есть, вся магия. Ты просто пишешь object Singleton — и всё, хуй с горы, у тебя уже готовый синглтон, который сам себя создаст, когда понадобится. Никаких тебе getInstance(), никаких synchronized, никаких проверок на null. Всё за тебя компилятор сделает, красота же!
Инициализация у него ленивая, то есть пока ты к нему не обратишься, он и не создастся. Как только первый раз вызовешь Singleton.doSomething() — вот тогда и сработает этот блок init, который ты видишь. Напечатает "Singleton initialized" и всё, объект готов. И главное — потокобезопасно! То есть можешь хоть из двадцати потоков дергать, он создастся только один раз, без всяких гонок. Доверия ебать ноль, но тут реально работает.
Дальше просто пользуешься, как будто это глобальная переменная: Singleton.doSomething(). Хуй в пальто, да и только! Всё настолько просто, что даже подозрение ебать чувствую — где же подвох? А его нет.
Ну и если вдруг тебе надо с Java кодом взаимодействовать, там из Java этот object выглядит не очень удобно. Но и тут придумали: можно над методами аннотацию @JvmStatic навесить, и из Java можно будет вызывать как статический метод. В общем, продумали всё, суки.
Вот честно, после такого как будто на дворе 2002-й год и ты городишь в Java свой синглтон с двойной проверкой — просто волнение ебать, как же мы раньше жили. В Kotlin это одна строчка, ёперный театр. Красота.