Kotlin const vs val: Was ist der Unterschied und was wählen?

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Kotlin const vs val: Was ist der Unterschied und was wählen?

\n\n

Sie schreiben Code in Kotlin und fragen sich plötzlich: "Was ist eigentlich der Unterschied zwischen const und val? Beide sind doch scheinbar unveränderlich?". Eine ausgezeichnete Frage! Dieser Punkt verwirrt selbst erfahrene Entwickler, die von Java oder anderen Sprachen wechseln. Kein Wunder, dass das Thema „What is the difference between "const" and "val"?“ auf Stack Overflow tausende Aufrufe erhält. Heute werden wir diese Frage ein für alle Mal klären, die Theorie Schritt für Schritt aufschlüsseln und alles mit lebendigen Codebeispielen untermauern.

\n\n

Bereit? Los geht's!

\n\n

Kurze Einführung: Was ist val?

\n\n

Beginnen wir mit dem Einfachsten. val (vom Wort value – Wert) ist eine unveränderliche Referenz. Sie können ihr einmal einen Wert zuweisen und ihn danach nie mehr ändern. Kommt Ihnen bekannt vor? Ja, es ist das Äquivalent zu final in Java oder readonly in C#.

\n\n
val name: String = "Alice"\nname = "Bob" // Compiler-Fehler! Val cannot be reassigned
\n\n

Aber es gibt eine wichtige Nuance: val garantiert, dass sich die Referenz nicht ändert, aber nicht die Unveränderlichkeit des Objekts selbst. Wenn Sie val mit einer veränderlichen Liste (MutableList) verwenden, können Sie dennoch Elemente hinzufügen und entfernen.

\n\n
val numbers = mutableListOf(1, 2, 3)\nnumbers.add(4) // Funktioniert!\n// numbers = mutableListOf(5, 6) // Fehler! Referenz kann nicht neu zugewiesen werden
\n\n

val kann sowohl bei der Deklaration als auch später im Code (z.B. im Konstruktor oder im init-Block) initialisiert werden. Sein Wert wird zur Laufzeit des Programms (runtime) berechnet.

\n\n

Und was ist const? Der strenge Wächter der Kompilierzeit

\n\n

const ist der strengere Bruder von val. Es ist ebenfalls unveränderlich, aber mit einer Superkraft: Der Wert muss zum Zeitpunkt der Kompilierung (compile-time) bekannt sein. Mit anderen Worten, es ist eine echte Konstante, die der Compiler direkt in den Code einfügen kann, wie eine eingebaute Konstante.

\n\n

const hat strenge Regeln:

\n
    \n
  • Kann nur auf Dateiebene (außerhalb einer Klasse) oder innerhalb eines object / companion object deklariert werden.
  • \n
  • Muss von einem primitiven Typ oder vom Typ String sein.
  • \n
  • Darf nicht das Ergebnis eines Funktionsaufrufs oder einer Berechnung sein – nur ein Literal oder eine andere Konstante.
  • \n
\n\n
// Richtig\nconst val PI = 3.14159\nconst val APP_NAME = "MyApp"\n\n// Falsch\nconst val currentTime = System.currentTimeMillis() // Fehler! Wert ist zum Zeitpunkt der Kompilierung nicht bekannt\nconst val userName = getName() // Fehler! Funktionsaufruf nicht zulässig
\n\n

Die Hauptunterschiede: const vs val in einer Tabelle

\n\n

Zur Veranschaulichung hier eine Vergleichstabelle:

\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
Kriteriumconst valval
InitialisierungszeitpunktZum Zeitpunkt der KompilierungZum Zeitpunkt der Ausführung
Wo deklarierbarTop-Level, object, companion objectÜberall (innerhalb einer Klasse, Funktion, Konstruktor)
DatentypenNur primitive Typen und StringBeliebige Typen (einschließlich Objekte, Listen)
LeistungMaximal (Inlining)Standard
Verwendung in AnnotationenJaNein
\n\n

Praktisches Beispiel: Annotationen und Leistung

\n\n

Eine der

Blogs

Buchempfehlungen