Einschränkungen
Was Value-Klassen nicht können
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
lateinitbesitzen - 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.
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
- Typaliase
- Inline-Value-Klassen
- Anwendungsfälle
- Einschränkungen