Объекты в Котлине
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.