Объекты в Котлине

Объекты в Котлине

1. Вступление

Котлин позаимствовал многие идеи из других языков; одна из таких конструкций -object.

В этой быстрой статье мы увидим, что такое объекты и как их можно использовать.

2. Объекты в Котлине

В Kotlin, как и почти во всех языках JVM, существует концепцияclass в качестве ядра модели объектно-ориентированного программирования. Kotlin introduces the concept of an object on top of that.

В то время какclass описывает структуры, которые могут быть созданы по мере необходимости, и позволяет использовать столько экземпляров, сколько необходимо,an object instead represents a single static instance, и никогда не может иметь больше или меньше этого экземпляра.

Это полезно для различных методов, включая одноэлементные объекты и простую упаковку функциональности для инкапсуляции:

object SimpleSingleton {
    val answer = 42;
    fun greet(name: String) = "Hello, $name!"
}

assertEquals(42, SimpleSingleton.answer)
assertEquals("Hello, world!", SimpleSingleton.greet("world"))

Objects also offer full support for visibility modifiers, что позволяет скрывать и инкапсулировать данные, как и в любом другом классе:

object Counter {
    private var count: Int = 0

    fun currentCount() = count

    fun increment() {
        ++count
    }
}
Counter.increment()
println(Counter.currentCount())
println(Counter.count) // this will fail to compile

Кроме того,objects can extend classes and implement interfaces. При этом они фактически являются единичными экземплярами родительских классов, как и ожидалось.

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

object ReverseStringComparator : Comparator {
    override fun compare(o1: String, o2: String) = o1.reversed().compareTo(o2.reversed())
}

val strings = listOf("Hello", "World")
val sortedStrings = strings.sortedWith(ReverseStringComparator)

3. Что такое объект-компаньон?

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

Сопутствующий объект всегда объявляется внутри другого класса. Whilst it can have a name, it doesn’t need to have one, и в этом случае он автоматически получает имяCompanion:

class OuterClass {
    companion object { // Equivalent to "companion object Companion"
    }
}

Companion objects allow their members to be accessed from inside the companion class without specifying the name.

В то же время, видимые члены могут быть доступны извне класса, если в качестве префикса используется имя класса:

class OuterClass {
    companion object {
        private val secret = "You can't see me"
        val public = "You can see me"
    }

    fun getSecretValue() = secret
}

assertEquals("You can see me", OuterClass.public)
assertEquals("You can't see me", OuterClass.secret) // Cannot access 'secret'

4. Статические поля

The main use for companion objects is to replace static fields/methods known from Java. Однако эти поля не создаются автоматически как таковые в итоговом файле класса.

Если нам нужно, чтобы они были сгенерированы, нам нужно вместо этого использовать аннотацию@JvmStatic в поле, которая затем сгенерирует байт-код, как ожидалось:

class StaticClass {
    companion object {
        @JvmStatic
        val staticField = 42
    }
}

Без этого статическое полеstaticField будет нелегко получить из кода Java.

Adding this annotation generates the field exactly as needed for a standard static field, allowing for full interoperability from Java if necessary.

Это означает, что приведенное выше генерирует методstaticgetStaticField() в классеStaticClass.

5. Заключение

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

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

Как всегда, фрагменты кода можно найти наover on GitHub.