1. Въведение
Котлин заимства много идеи от други езици; една от тези конструкции е обектът.
В тази бърза статия ще видим какви са обектите и как могат да се използват.
2. Обекти в Котлин
В Kotlin, както и в почти всички JVM езици, има концепцията за клас като ядро на модела на обектно-ориентирано програмиране. Котлин въвежда концепцията за обект на всичкото отгоре.
Като има предвид клас описва структури, които могат да бъдат инстанция, както и когато е необходимо и дава възможност за най-много случаи, както е необходимо, един обект вместо представлява единична статичен например и не може да има повече или по-малко от този модел.
Това е полезно за различни техники, включително единични обекти и просто опаковане на функционалността за капсулиране:
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 { 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 () за класа StaticClass .
5. Заключение
Обектите в Kotlin добавят цял допълнителен слой, който можем да използваме, допълнително рационализират нашия код и улесняват развитието му.
След това обектите-спътници правят това още по-далеч, позволявайки по-чист код, който е по-лесен за поддържане и работа с него.
Както винаги, кодови фрагменти могат да бъдат намерени отново върху GitHub.