> Что такое companion objects в Kotlin (Kotlin, Android)

Уровень: junior · Роль: mobile · Категория: Технические вопросы

Компании: ЛеруаМерлен, Ozon, Яндекс, Астра, IBS

Стек: Kotlin, Android

> Пример ответа

Короткий ответ

Companion object - это объект-компаньон, объявленный внутри класса с помощью ключевого слова companion. Он позволяет определять статические-like члены (методы и свойства), которые принадлежат самому классу, а не его экземплярам. В Kotlin нет ключевого слова static, поэтому companion object - основной способ имитации статического поведения. Доступ к членам companion object осуществляется через имя класса, например MyClass.someMethod().

Подробное объяснение

Companion object - это singleton-объект, который связан с классом, в котором он объявлен. Он создаётся один раз при загрузке класса и существует на протяжении всей жизни программы. Внутри companion object можно объявлять функции, свойства, константы и даже другие объекты.

Ключевые особенности:

  • Члены companion object доступны через имя класса без создания экземпляра.
  • Companion object может иметь имя (по умолчанию Companion), но обычно используется безымянный вариант.
  • Companion object может реализовывать интерфейсы и наследоваться от классов.
  • Внутри companion object можно обращаться к приватным членам внешнего класса.
  • В Java-коде к членам companion object обращаются через поле Companion (например, MyClass.Companion.someMethod()), если не указано @JvmStatic.

Отличие от обычного объекта: обычный object - это независимый singleton, а companion object всегда привязан к конкретному классу и разделяет с ним область видимости.

На практике

В Android-разработке companion object часто используется для:

  • Фабричных методов (например, createInstance()).
  • Констант, связанных с классом (например, TAG для логирования).
  • Сохранения ссылки на экземпляр (например, в паттерне Singleton).
  • Определения Intent extra keys или request codes.
  • Реализации Parcelable через CREATOR.

Также companion object позволяет реализовать статические методы, которые в Java-коде будут вызываться как обычные статические, если добавить аннотацию @JvmStatic.

Пример кода

class User(val name: String) {

    companion object {
        const val DEFAULT_AGE = 18
        private val users = mutableListOf<User>()

        fun create(name: String): User {
            val user = User(name)
            users.add(user)
            return user
        }

        fun allUsers(): List<User> = users
    }
}

// Использование
val user = User.create("Alice")
println(User.DEFAULT_AGE) // 18
println(User.allUsers())  // [User(name=Alice)]

Как отвечать на собеседовании

Начни с определения: companion object - это объект, привязанный к классу, который заменяет static из Java. Затем объясни, зачем он нужен: для фабричных методов, констант и утилитных функций. Упомяни, что companion object - это singleton, и он создаётся один раз. Приведи пример из Android: TAG для логирования или фабричный метод для создания фрагмента. Если спросят про Java-интероп, скажи про @JvmStatic и поле Companion. Не углубляйся в сложные темы, если не просят.

Что проверяет интервьюер

Интервьюер проверяет:

  • Понимание разницы между companion object и обычным object.
  • Знание, как имитировать статические члены в Kotlin.
  • Понимание области видимости и времени жизни companion object.
  • Умение применять companion object в реальных Android-задачах (константы, фабрики).
  • Базовое понимание интероперабельности с Java.

Типичные ошибки

  • Путаница между companion object и обычным object - это разные вещи.
  • Забывают, что companion object - это singleton, и пытаются создавать его экземпляры.
  • Используют companion object для хранения изменяемого состояния без необходимости - это может привести к утечкам памяти.
  • Не знают про @JvmStatic и пытаются вызвать методы из Java как статические, но получают ошибку.
  • Объявляют const val внутри companion object без необходимости - const работает только для примитивов и строк, для остального нужен val.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью