Kotlin Academy · Lektion

Einschränkungen

Was Value-Klassen nicht können

Lektion 4 von 413 Schritte

Einschränkungen ist eine kostenlose Kotlin Academy-Lektion auf CoddyKit. Dies ist Lektion 4 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Kotlin Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Kotlin Academy-Kurs umfasst insgesamt 4 Lektionen.

Die Grenzen kennen

Wertklassen sind leistungsfähig, aber eingeschränkt. Wenn Sie ihre Grenzen kennen, können Sie das passende Werkzeug auswählen und Überraschungen vermeiden.

Genau eine Eigenschaft

Eine Wertklasse verpackt genau einen einzelnen Wert. Um mehrere Felder zu gruppieren, benötigen Sie eine reguläre Klasse oder eine data class.

// @JvmInline value class Range(val lo: Int, val hi: Int) // not allowed

data class Range(val lo: Int, val hi: Int)

fun main() {
    println(Range(1, 10))
}

Kein zusätzlicher Zustand über den Wert hinaus

Wertklassen dürfen außer der einzelnen Konstruktor-Eigenschaft keine weiteren Backing Fields besitzen. Zusätzlicher var-Zustand mit einem Backing Field ist nicht erlaubt.

@JvmInline
value class Counter(val value: Int) {
    // val cached: Int = value * 2  // not allowed: extra backing field
    val doubled: Int get() = value * 2  // computed is fine
}

fun main() {
    println(Counter(3).doubled)
}

Keine Vererbung

Wertklassen sind implizit final. Sie können keine anderen Klassen erweitern und auch nicht erweitert werden. Sie dürfen nur Schnittstellen implementieren.

interface Named { val label: String }

@JvmInline
value class Tag(val text: String) : Named {
    override val label: String get() = text
}

fun main() {
    println(Tag("urgent").label)
}

Boxing-Kosten kehren zurück

Das Versprechen des fehlenden zusätzlichen Aufwands gilt nicht mehr, wenn der Wert als nullable, generischer oder als Schnittstellentyp verwendet wird. Der Compiler verpackt ihn dann in ein echtes Objekt.

@JvmInline
value class Id(val raw: Int)

fun main() {
    val list: List<Id> = listOf(Id(1), Id(2)) // boxed inside the list
    println(list.map { it.raw })
}

Keine Identität

Wertklassen besitzen keine stabile Referenzidentität. Referenzgleichheit mit === ist bedeutungslos, und sie können nicht dort verwendet werden, wo Objektidentität wichtig ist, etwa als Synchronisationssperre.

@JvmInline
value class Code(val value: Int)

fun main() {
    val a = Code(5)
    val b = Code(5)
    println(a == b)   // structural equality works
}

Nicht lateinit oder delegiert

Sie können lateinit nicht auf den zugrunde liegenden Wert anwenden, und Wertklassen unterstützen keine Property Delegation für ihr einzelnes Feld. Der Wert muss im Konstruktor gesetzt werden.

@JvmInline
value class Slug(val value: String)

fun main() {
    val s = Slug("hello-world") // must be provided up front
    println(s.value)
}

Namensmangling auf der JVM

Auf der JVM erhalten Funktionen mit Parametern vom Typ einer Wertklasse im Bytecode manipulierte Namen, um Namenskonflikte zu vermeiden. Das erschwert die Java-Interoperabilität; Java-Aufrufer können diese Funktionen möglicherweise nicht problemlos sehen.

@JvmInline
value class Hz(val value: Int)

fun tune(freq: Hz) = freq.value

fun main() {
    println(tune(Hz(440))) // simple from Kotlin; mangled from Java
}

Nicht für Wrapper mit mehreren Feldern

Wenn Sie sich zwei Eigenschaften wünschen, ist eine Wertklasse das falsche Werkzeug. Verwenden Sie stattdessen eine data class und akzeptieren Sie die Objekterstellung zugunsten einer umfangreicheren Struktur.

data class Coordinate(val lat: Double, val lng: Double)

fun main() {
    println(Coordinate(41.0, 29.0))
}

Zusammenfassung der Einschränkungen

Wertklassen können nicht:

  • Mehr als eine Eigenschaft enthalten
  • Zusätzliche Backing Fields oder lateinit besitzen
  • Von Klassen erben oder von Klassen erweitert werden
  • Referenzidentität bereitstellen
  • Boxing immer vermeiden

Mit Bedacht auswählen

Verwenden Sie eine Wertklasse für einen einzelnen, validierten, typsicheren Wert. Verwenden Sie eine data class für gruppierte Daten. Verwenden Sie einen Typalias für reine Lesbarkeit ohne zusätzliche Sicherheit. Jedes Werkzeug hat seinen Platz.

Kurzer Test

Testen Sie Ihr Verständnis der Einschränkungen von Wertklassen.

Zusammenfassung

Sie haben die Einschränkungen von Wertklassen kennengelernt:

  • Eine Eigenschaft, keine zusätzlichen Backing Fields
  • Keine Vererbung, keine Identität
  • Boxing tritt bei der Verwendung als nullable, generischer oder als Schnittstellentyp wieder auf
  • Namensmangling auf der JVM erschwert die Java-Interoperabilität

Wählen Sie das Werkzeug passend zum Bedarf.

Kostenlos starten

Lerne Kotlin mit einem KI-Tutor — kostenlos

Schreibe und führe echten Code in deinem Browser aus, bekomme sofortige Hilfe von einem 24/7 KI-Tutor und setze dein Lernen im Web oder in der App fort.

Kurse
51
Lektionen
203

Häufig gestellte Fragen

Ist die Lektion „Einschränkungen“ kostenlos?

Ja — der vollständige Text von „Einschränkungen“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Kotlin Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Kotlin Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „Einschränkungen“?

Was Value-Klassen nicht können Du übst Kotlin Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um Kotlin Academy zu starten?

Keine Vorkenntnisse erforderlich. Kotlin Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 4 von 4.

Wie lange dauert die Lektion „Einschränkungen“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser Kotlin Academy-Lektion Code schreiben und ausführen?

Ja. Jede Kotlin Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. Typaliase
  2. Inline-Value-Klassen
  3. Anwendungsfälle
  4. Einschränkungen
← Zurück zu Kotlin Academy