Что такое ключевое слово object в Kotlin

Ответ

Ключевое слово object в Kotlin используется для создания синглтона (объекта с единственным экземпляром) или анонимного объекта (объекта без имени).

1. Singleton:

object DatabaseHelper {
    fun connect() { /* ... */ }
}

Использование:

DatabaseHelper.connect() // Доступ к единственному экземпляру

2. Анонимный объект (замена Java-анонимных классов):

val listener = object : View.OnClickListener {
    override fun onClick(v: View?) { /* ... */ }
}

3. Companion Object:
Аналог статических методов/полей в Java:

class MyClass {
    companion object {
        const val TAG = "MyClass"
    }
}

Использование: MyClass.TAG.

Объекты инициализируются лениво (при первом обращении) и потокобезопасны.

Ответ 18+ 🔞

Эй, слушай, давай разберём эту тему про object в Kotlin, а то у некоторых голова уже квадратная становится, как они пытаются понять, что это за хуйня такая. Ну, типа, представь себе — тебе нужен какой-то один-единственный экземпляр чего-то там на весь проект. Ну, там, какой-нибудь DatabaseHelper, который везде один и тот же, чтобы не плодить сущностей, как говна за баней. Так вот, для этого и придумали синглтон через object. Пишешь просто:

object DatabaseHelper {
    fun connect() { /* ... */ }
}

И всё, ёпта! Теперь где угодно тыкаешь DatabaseHelper.connect() — и это всегда один и тот же объект, создаётся лениво, когда впервые нужен, и потокобезопасно, блядь. Удобно же, правда? Никаких тебе getInstance() и прочей херни, как в Java.

А ещё есть анонимные объекты — это когда тебе срочно нужна какая-то одноразовая реализация интерфейса, а создавать целый класс — овердохуища возни. Ну, типа:

val listener = object : View.OnClickListener {
    override fun onClick(v: View?) { /* ... */ }
}

Сделал и забыл, как страшный сон. Красота!

Ну и куда же без companion object — это же наше всё, замена этим дурацким статическим методам из Java. Хочешь константу или метод, чтобы вызывать без создания экземпляра класса? Пожалуйста:

class MyClass {
    companion object {
        const val TAG = "MyClass"
    }
}

И потом юзаешь, как миленький: MyClass.TAG. Никакой магии, всё просто, как три копейки. Главное — запомни, что object это не просто какая-то хуйня с горы, а вполне себе конкретный инструмент, который экономит время и нервы. Ну, если, конечно, применять его с умом, а не тыкать везде, где попало, как мартышлюшка с гранатой.