Objekte in Kotlin

1. Einleitung

Kotlin lieh sich viele Ideen aus anderen Sprachen; Eines dieser Konstrukte ist das Objekt.

In diesem kurzen Artikel werden wir sehen, was Objekte sind und wie sie verwendet werden können.

2. Objekte in Kotlin

In Kotlin gibt es wie in fast allen JVM-Sprachen das Konzept einer Klasse als Kern des objektorientierten Programmiermodells. Darüber hinaus führt Kotlin das Konzept eines Objekts ein .

Während eine Klasse Strukturen beschreibt, die nach Bedarf instanziiert werden können und so viele Instanzen wie erforderlich zulassen, stellt ein Objekt stattdessen eine einzelne statische Instanz dar und kann niemals mehr oder weniger als diese eine Instanz haben.

Dies ist nützlich für verschiedene Techniken, einschließlich Singleton-Objekte und einfaches Packen von Funktionen für die Kapselung:

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

Objekte bieten auch vollständige Unterstützung für Sichtbarkeitsmodifikatoren , sodass Daten wie bei jeder anderen Klasse ausgeblendet und gekapselt werden können:

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

Darüber hinaus können Objekte Klassen erweitern und Schnittstellen implementieren . Dabei handelt es sich effektiv wie erwartet um Singleton-Instanzen übergeordneter Klassen.

Dies kann sehr nützlich sein, wenn wir eine zustandslose Implementierung haben und nicht jedes Mal eine neue Instanz erstellt werden muss - z. B. 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. Was ist ein Begleitobjekt?

Companion - Objekte sind im Wesentlichen die gleiche wie eine Standard - Objektdefinition, nur mit ein paar zusätzlichen Funktionen Entwicklung zu erleichtern.

Ein Begleitobjekt wird immer innerhalb einer anderen Klasse deklariert. Es kann zwar einen Namen haben, muss aber keinen haben . In diesem Fall hat es automatisch den Namen Companion :

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

Companion-Objekte ermöglichen den Zugriff auf ihre Mitglieder innerhalb der Companion-Klasse, ohne den Namen anzugeben .

Gleichzeitig kann von außerhalb der Klasse auf sichtbare Mitglieder zugegriffen werden, wenn der Klassenname vorangestellt wird:

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. Statische Felder

Die Hauptverwendung für Begleitobjekte besteht darin, statische Felder / Methoden zu ersetzen, die aus Java bekannt sind . Diese Felder werden jedoch nicht automatisch als solche in der resultierenden Klassendatei generiert.

Wenn sie generiert werden müssen, müssen wir stattdessen die Annotation @JvmStatic für das Feld verwenden, die dann den Bytecode wie erwartet generiert:

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

Ohne dies ist das statische Feld staticField über Java-Code nicht leicht zugänglich.

Durch Hinzufügen dieser Anmerkung wird das Feld genau nach Bedarf für ein statisches Standardfeld generiert, sodass bei Bedarf eine vollständige Interoperabilität von Java aus möglich ist .

Dies bedeutet, dass das oben Gesagte eine statische Methode getStaticField () für die StaticClass- Klasse generiert .

5. Schlussfolgerung

Objekte in Kotlin fügen eine zusätzliche Ebene hinzu, die wir verwenden können, wodurch unser Code weiter optimiert und die Entwicklung vereinfacht wird.

Companion-Objekte gehen noch einen Schritt weiter und ermöglichen so saubereren Code, der einfacher zu warten und zu bearbeiten ist.

Wie immer finden Sie Code-Schnipsel auf GitHub.