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

1. Введение

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

3. Что такое сопутствующий объект?

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

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

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

Объекты-компаньоны позволяют получать доступ к своим элементам из класса-компаньона без указания имени.

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

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. Статические поля

Основное назначение сопутствующих объектов - заменить статические поля/методы, известные из Java. Однако эти поля не генерируются автоматически как таковые в результирующем файле класса.

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

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

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

При добавлении этой аннотации поле будет генерироваться в точности так, как требуется для стандартного статического поля, что при необходимости обеспечит полную совместимость с Java.

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

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

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

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

Оригинал статьи: https://www.baeldung.com/kotlin/objects