Object

https://kotlinlang.org/docs/object-declarations.html
object

Используется для объявления объектов, которые могут быть единичными экземплярами (Singleton) или анонимными классами. Когда вы объявляете объект с помощью ключевого слова object, Kotlin создает единственный экземпляр этого объекта, который доступен по всему коду. Это удобно для создания глобальных состояний и функций.

object Database {
    fun connect() {
        // Логика подключения к базе данных
    }
}

// Использование
Database.connect()
data object

object с автоматической генерацией функции toString().

object MyObject

data object MyDataObject

fun main() {
    println(MyObject) // org.example.MyObject@1f32e575
    println(MyDataObject) // MyDataObject
}
companion object

Специальный объект, связанный с классом, который позволяет реализовать статические поля, аналогично статическим методам и переменным в других языках, таких как Java. Функции такого объекта можно вызывать через класс. Инициализируется в момент загрузки своего родительского класса.

class MyClass {
    companion object {
        const val CONSTANT = 42

        fun create(): MyClass {
            return MyClass()
        }
    }
}

fun main() {
    println(MyClass.CONSTANT) // Вывод: 42
    val myObject = MyClass.create() // Создание экземпляра MyClass
}

• По умолчанию companion object не имеет имени, но его можно назвать для удобства.

class MyClass {
    companion object Factory {
        fun create(): MyClass {
            return MyClass()
        }
    }
}

val myObject = MyClass.Factory.create()

companion object может реализовывать интерфейсы, что позволяет организовать код.

interface Creator<T> {
    fun create(): T
}

class MyClass {
    companion object: Creator<MyClass> {
        override fun create(): MyClass {
            return MyClass()
        }
    }
}
Анонимные объекты

С помощью object можно создать анонимный класс, который может реализовать интерфейсы или наследовать от классов. Это полезно, когда нужно создать объект, который не будет использоваться повторно.

val listener = object: OnClickListener {
    override fun onClick(view: View) {
        // Реакция на клик
    }
}

binding.root.setOnClickListener(listener)
Объектные выражения

Создание временных объектов с определенными свойствами.

val person = object {
    var name: String = "John"
    var age: Int = 30
    
    // тип анонимных объектов - Any, поэтому `override` необходим в `toString()`
    override fun toString() = "name=$name, age=$age"
}

// Использование
println("${person.name}, age ${person.age}")  // Вывод: John, age 30
Вопросы на собесе (8)
  • object (4)
    1. Что такое object?

      Ключевое слово для создания анонимных классов и синглтонов, позволяющее создавать экземпляры без явного определения класса.

    1. Варианты использования object в Kotlin?

      object и data object - синглтон.

      companion object

      Анонимный класс

      Объектное выражение

    1. Можно ли наследоваться от object?

      Нет. Объект является синглтоном, и его нельзя расширять или создавать его подклассы.

    1. Как object выглядит под капотом в Java?

      В Kotlin object создаёт синглтон, который под капотом реализуется как статический класс в Java. Он содержит статические методы и свойства, инициализируется при первом обращении.

      object Singleton {
          init {
              // Инициализация
          }
      
          fun doSomething() {
              // Логика метода
          }
      }
      public final class Singleton {
          private static final Singleton INSTANCE = new Singleton();
      
          private Singleton() {
              // Инициализация
          }
      
          public static Singleton getInstance() {
              return INSTANCE;
          }
          
          public void doSomething() {
              // Логика метода
          }
      }
  • companion object (4)
    1. Зачем нужен companion object?

      Используется для создания статических членов класса, что позволяет определять свойства и методы, которые могут быть вызваны без создания экземпляра класса. Это удобно для создания фабричных методов, констант или для реализации интерфейсов.

    1. Когда инициализируется companion object?

      При первом обращении к классу, в котором он объявлен. Это происходит до создания любого экземпляра класса, что делает его доступным для статических вызовов и операций.

    1. Чем является companion object: inner или nested классом?

      Является nested классом и не имеет ссылки на экземпляр внешнего класса.

    1. Имеет ли companion object доступ к приватным полям класса в котором объявлен?

      Да.