Objekte in Kotlin

Gegenstände in Kotlin

1. Einführung

Kotlin lieh sich viele Ideen aus anderen Sprachen; Eines dieser Konstrukte istobject.

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

2. Gegenstände in Kotlin

In Kotlin gibt es wie in fast allen JVM-Sprachen das Konzept einesclass als Kern des objektorientierten Programmiermodells. Kotlin introduces the concept of an object on top of that.

Währendclass Strukturen beschreibt, die nach Bedarf instanziiert werden können und so viele Instanzen wie nötig zulassen,an object instead represents a single static instance und niemals mehr oder weniger als diese eine Instanz haben können.

Dies ist nützlich für verschiedene Techniken, einschließlich Singleton-Objekten und einfachem 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"))

Objects also offer full support for visibility modifiers, wodurch das Ausblenden und Einkapseln von Daten wie bei jeder anderen Klasse ermöglicht wird:

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

Zusätzlichobjects can extend classes and implement interfaces. Dabei handelt es sich genau wie erwartet um Singleton-Instanzen von übergeordneten Klassen.

Dies kann in Fällen sehr nützlich sein, in denen eine zustandslose Implementierung vorliegt und nicht jedes Mal eine neue Instanz erstellt werden muss - z. 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 entsprechen im Wesentlichen der Standarddefinition vonobject, nur mit einigen zusätzlichen Funktionen, um die Entwicklung zu vereinfachen.

Ein Companion-Objekt wird immer innerhalb einer anderen Klasse deklariert. Whilst it can have a name, it doesn’t need to have one, in diesem Fall hat es automatisch den NamenCompanion:

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.

Gleichzeitig kann auf sichtbare Mitglieder von außerhalb der Klasse 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

The main use for companion objects is to replace static fields/methods known from Java. 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@JvmStaticfür das Feld verwenden, wodurch der Bytecode wie erwartet generiert wird:

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

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

Adding this annotation generates the field exactly as needed for a standard static field, allowing for full interoperability from Java if necessary.

Dies bedeutet, dass das oben Gesagte einestatic-MethodegetStaticField() für dieStaticClass-Klasse generiert.

5. Fazit

Objekte in Kotlin fügen eine ganze zusätzliche Ebene hinzu, die wir verwenden können, um unseren Code weiter zu optimieren und die Entwicklung zu vereinfachen.

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

Wie immer können Code-Schnipsel überover on GitHub gefunden werden.