Best Practices
Halten Sie Operatoren intuitiv
Best Practices 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.
Operatoren intuitiv halten
Überladen Sie einen Operator nur, wenn seine Bedeutung offensichtlich ist. + für Vektoren ist eindeutig; + mit der Bedeutung „E-Mail senden“ ist es nicht.
data class Vec(val x: Int, val y: Int) {
operator fun plus(o: Vec) = Vec(x + o.x, y + o.y)
}
fun main() {
println(Vec(1, 2) + Vec(3, 4))
}Erwartete Semantik beibehalten
Beachten Sie die üblichen algebraischen Eigenschaften: a + b sollte sich bei symmetrischen Typen kommutativ verhalten und Leser nicht überraschen.
data class Money(val cents: Int) {
operator fun plus(o: Money) = Money(cents + o.cents)
}
fun main() {
println(Money(100) + Money(50))
}Unveränderlichkeit bevorzugen
Operatoren wie plus sollten einen neuen Wert zurückgeben, statt den Empfänger zu verändern, entsprechend dem Verhalten von Zahlen.
data class Point(val x: Int) {
operator fun plus(o: Point) = Point(x + o.x)
}
fun main() {
val a = Point(1)
val b = a + Point(2)
println("${a.x} ${b.x}")
}plus im Vergleich zu plusAssign
Definieren Sie plus für unveränderliche Werte und plusAssign für die direkte Veränderung veränderlicher Container. Vermeiden Sie es, beide mit widersprüchlichem Verhalten zu definieren.
class Cart {
val items = mutableListOf<String>()
operator fun plusAssign(item: String) { items.add(item) }
}
fun main() {
val c = Cart()
c += "book"
println(c.items)
}Rückgabetypen abstimmen
Geben Sie bei binären Operatoren denselben Typ zurück, damit sich Ergebnisse natürlich verketten lassen.
data class N(val v: Int) {
operator fun plus(o: N) = N(v + o.v)
}
fun main() {
println((N(1) + N(2) + N(3)).v)
}Nicht aus Raffinesse überladen
Wenn eine benannte Funktion besser lesbar ist, verwenden Sie sie. Operatoren sind für wirklich numerische oder containerartige Semantik gedacht, nicht für Rätsel.
data class Log(val lines: List<String>) {
fun append(line: String) = Log(lines + line)
}
fun main() {
println(Log(emptyList()).append("start").lines)
}equals und hashCode konsistent halten
Wenn Sie Vergleiche oder Gleichheit überladen, halten Sie equals und hashCode synchron, damit Kollektionen nicht fehlerhaft arbeiten.
data class Id(val v: Int)
fun main() {
val set = hashSetOf(Id(1), Id(1))
println(set.size)
}Vorrangregeln von Operatoren beachten
Überladene Operatoren behalten den integrierten Vorrang. Entwerfen Sie sie so, dass der natürliche Vorrang zu den erwarteten Ergebnissen führt.
data class N(val v: Int) {
operator fun plus(o: N) = N(v + o.v)
operator fun times(o: N) = N(v * o.v)
}
fun main() {
println((N(2) + N(3) * N(4)).v)
}Überraschende Operatoren dokumentieren
Wenn ein Operator etwas Nicht-Offensichtliches tut, fügen Sie einen Kommentar oder KDoc hinzu, damit Aufrufer nicht in die Irre geführt werden.
data class Range2(val start: Int, val end: Int) {
// contains: is value inside the range?
operator fun contains(v: Int) = v in start..end
}
fun main() {
println(5 in Range2(1, 10))
}contains für in verwenden
Der Operator in wird auf contains abgebildet. Überschreiben Sie ihn nur, wenn die Mitgliedschaft für Ihren Typ eindeutig definiert ist.
class Team(val members: List<String>) {
operator fun contains(name: String) = name in members
}
fun main() {
val t = Team(listOf("Ann", "Bo"))
println("Ann" in t)
}Im Zweifel eine Funktion verwenden
Eine klar benannte Methode ist fast immer sicherer als ein unklarer Operator. Beschränken Sie Überladungen auf Fälle, in denen sie die Lesbarkeit wirklich verbessern.
data class Temperature(val c: Int) {
fun warmerThan(o: Temperature) = c > o.c
}
fun main() {
println(Temperature(30).warmerThan(Temperature(20)))
}Kurzer Test
Testen Sie Ihr Verständnis der Best Practices für die Operatorüberladung.
Zusammenfassung
Sie haben die Best Practices für die Operatorüberladung gelernt:
- Überladen Sie nur, wenn die Bedeutung offensichtlich und konventionell ist.
- Bevorzugen Sie unveränderliche Rückgabewerte desselben Typs und halten Sie Ergebnisse verkettbar.
- Trennen Sie
plus(Wert) vonplusAssign(Veränderung). - Halten Sie
equals/hashCodekonsistent und bevorzugen Sie benannte Funktionen, wenn diese klarer sind.
data class V(val x: Int) {
operator fun plus(o: V) = V(x + o.x)
}
fun main() {
println((V(2) + V(5)).x)
}Häufig gestellte Fragen
Ist die Lektion „Best Practices“ kostenlos?
Ja — der vollständige Text von „Best Practices“ 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 „Best Practices“?
Halten Sie Operatoren intuitiv 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 „Best Practices“?
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
- Operatorfunktionen
- Vergleichsoperatoren
- Index und Invoke
- Best Practices