0Pricing
Kotlin Academy · Урок

companion object: статические элементы в Kotlin

Добавляйте companion object в классы, чтобы имитировать статические методы и константы.

«companion object: статические элементы в Kotlin» — бесплатный урок Kotlin Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Kotlin Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Kotlin Academy содержит 4 уроков всего.

Статических членов нет, но есть companion object

В Kotlin нет ключевого слова static. Вместо него companion object, объявленный внутри класса, предоставляет члены уровня класса, аналогичные статическим.

Объявление companion object

Поместите companion object внутрь класса. Его члены можно вызывать как ClassName.member.

class MathUtils {
    companion object {
        fun square(x: Int) = x * x
    }
}
fun main() {
    println(MathUtils.square(5)) // 25
}

Константы в companion object

Константы обычно размещают в companion object, часто используя const val для литералов времени компиляции.

class HttpClient {
    companion object {
        const val DEFAULT_TIMEOUT = 5000
        const val USER_AGENT = "MyApp/1.0"
    }
}
fun main() {
    println(HttpClient.DEFAULT_TIMEOUT)
    println(HttpClient.USER_AGENT)
}

Именованный companion object

Вы можете дать имя companion object. Работают и ClassName.member, и ClassName.CompanionName.member.

class Database {
    companion object Factory {
        fun create() = Database()
    }
}
fun main() {
    val db1 = Database.create()       // works
    val db2 = Database.Factory.create() // also works
    println("$db1 / $db2")
}

Шаблон фабричного метода

Используйте сопутствующий объект для создания экземпляров с проверкой данных или альтернативной логикой конструирования.

class User private constructor(val name: String, val email: String) {
    companion object {
        fun create(name: String, email: String): User {
            require(email.contains("@")) { "invalid email" }
            return User(name, email)
        }
    }
}
fun main() {
    val u = User.create("Ada", "ada@example.com")
    println("${u.name} <${u.email}>")
}

Реализация интерфейсов

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

interface Loadable<T> { fun load(): T }
class Config(val data: String) {
    companion object : Loadable<Config> {
        override fun load() = Config("loaded data")
    }
}
fun main() {
    println(Config.load().data)
}

@JvmStatic для взаимодействия с Java

Аннотируйте элементы сопутствующего объекта с помощью @JvmStatic, чтобы предоставить вызывающему коду на Java настоящие статические методы.

class Util {
    companion object {
        @JvmStatic
        fun greet(name: String) = "Hello, $name!"
    }
}
fun main() {
    println(Util.greet("Kotlin"))
    // In Java: Util.greet("Java")
}

Прямой доступ к сопутствующему объекту

ClassName.Companion напрямую ссылается на сопутствующий объект. Используйте эту запись, когда передаёте его как аргумент.

class Counter {
    companion object {
        fun greet() = "hi from companion"
    }
}
fun main() {
    val ref = Counter.Companion
    println(ref.greet())
}

Сопутствующий объект и верхний уровень

Для вспомогательных функций, не относящихся к классу, предпочитайте верхнеуровневые функции классу, содержащему только сопутствующий объект.

// File-level — usually cleaner:
fun greet(name: String) = "Hi, $name!"
// Versus:
class Greeter { companion object { fun greet(n: String) = "Hi, $n!" } }
fun main() {
    println(greet("Ada"))
    println(Greeter.greet("Ada"))
}

Один сопутствующий объект на класс

У класса может быть не более одного сопутствующего объекта. При необходимости дополнительные общие данные можно хранить во вложенных обычных объектах.

class Service {
    companion object {
        val version = "1.0"
    }
    object InternalHelper { fun log() = println("internal") }
}
fun main() {
    println(Service.version)
    Service.InternalHelper.log()
}

Функции-расширения сопутствующего объекта

Можно расширить сопутствующий объект за пределами класса, добавив вспомогательные функции, имитирующие статические.

class Lib {
    companion object
}
fun Lib.Companion.helper() = "added later"
fun main() {
    println(Lib.helper())
}

Быстрая проверка

Какой механизм Kotlin эквивалентен элементам Java, объявленным как static?

Итоги

В Kotlin нет static. Используйте сопутствующий объект для элементов уровня класса — констант, фабрик и реализаций интерфейсов. Добавляйте аннотацию @JvmStatic для взаимодействия с Java или расширяйте объект функциями-расширениями для вспомогательных функций, имитирующих статические.

Часто задаваемые вопросы

Урок «companion object: статические элементы в Kotlin» бесплатный?

Да — полный текст урока «companion object: статические элементы в Kotlin» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Kotlin Academy, подпишись на CoddyKit PRO. Курс Kotlin Academy содержит 4 уроков всего.

Чему я научусь в уроке «companion object: статические элементы в Kotlin»?

Добавляйте companion object в классы, чтобы имитировать статические методы и константы. Ты практикуешь Kotlin Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Kotlin Academy?

Предыдущий опыт не требуется. Kotlin Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.

Сколько времени занимает урок «companion object: статические элементы в Kotlin»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Kotlin Academy?

Да. Каждый урок Kotlin Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Объявление object: синглтоны Kotlin
  2. companion object: статические элементы в Kotlin
  3. Анонимные объекты и объектные выражения
  4. Фабричные методы с companion object
← Назад к Kotlin Academy