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

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.