var & val

Wenn ein Bezeichner Daten enthält, müssen Sie entscheiden, ob er neu zugewiesen werden kann.

Sie erstellen Bezeichner, um auf Elemente in Ihrem Programm zu verweisen. Die grundlegendste Entscheidung für einen Datenbezeichner ist, ob er seinen Inhalt während der Programmausführung ändern kann oder ob er nur einmal zugewiesen werden kann. Dies wird durch zwei Schlüsselwörter gesteuert:

  • var, kurz für Variable, was bedeutet, dass Sie seinen Inhalt neu zuweisen können.
  • val, kurz für Wert, was bedeutet, dass Sie ihn nur initialisieren können; Sie können ihn nicht neu zuweisen.

Sie definieren ein var so:

var identifier = initialization

Das Schlüsselwort var wird gefolgt von dem Bezeichner, einem Gleichheitszeichen und dann dem Initialisierungswert. Der Bezeichner beginnt mit einem Buchstaben oder einem Unterstrich, gefolgt von Buchstaben, Zahlen und Unterstrichen. Groß- und Kleinschreibung werden unterschieden (also sind thisvalue und thisValue unterschiedlich).

Hier sind einige var Definitionen:

// VarAndVal/Vars.kt

fun main() {
  var whole = 11              // [1]
  var fractional = 1.4        // [2]
  var words = "Twas Brillig"  // [3]
  println(whole)
  println(fractional)
  println(words)
}
/* Output:
11
1.4
Twas Brillig
*/

In diesem Buch versehen wir Zeilen mit kommentierten Nummern in eckigen Klammern, damit wir im Text auf sie verweisen können, wie folgt:

  • [1] Erstellen Sie eine var namens whole und speichern Sie 11 darin.
  • [2] Speichern Sie die “Bruchzahl” 1.4 in der var fractional.
  • [3] Speichern Sie etwas Text (einen String) in der var words.

Beachten Sie, dass println() jeden einzelnen Wert als Argument annehmen kann.

Wie der Name Variable impliziert, kann eine var variieren. Das heißt, Sie können die in einer var gespeicherten Daten ändern. Wir sagen, dass eine var veränderlich ist:

// VarAndVal/AVarIsMutable.kt

fun main() {
  var sum = 1
  sum = sum + 2
  sum += 3
  println(sum)
}
/* Output:
6
*/

Die Zuweisung sum = sum + 2 nimmt den aktuellen Wert von sum, addiert zwei und weist das Ergebnis zurück in sum zu.

Die Zuweisung sum += 3 bedeutet dasselbe wie sum = sum + 3. Der += Operator nimmt den vorher gespeicherten Wert in sum und erhöht ihn um 3, dann weist er dieses neue Ergebnis zurück in sum zu.

Den in einer var gespeicherten Wert zu ändern, ist eine nützliche Methode, um Änderungen auszudrücken. Wenn jedoch die Komplexität eines Programms zunimmt, ist Ihr Code klarer, sicherer und leichter zu verstehen, wenn die Werte, die durch Ihre Bezeichner dargestellt werden, sich nicht ändern können—das heißt, sie können nicht neu zugewiesen werden. Wir spezifizieren einen unveränderlichen Bezeichner, indem wir statt var das Schlüsselwort val verwenden. Ein val kann nur einmal zugewiesen werden, wenn es erstellt wird:

val identifier = initialization

Das Schlüsselwort val stammt von Wert und deutet auf etwas hin, das sich nicht ändern kann—es ist unveränderlich. Wählen Sie wann immer möglich val anstelle von var. Das Vars.kt-Beispiel am Anfang dieses Abschnitts kann unter Verwendung von vals umgeschrieben werden:

// VarAndVal/Vals.kt

fun main() {
  val whole = 11
  // whole = 15 // Error   // [1]
  val fractional = 1.4
  val words = "Twas Brillig"
  println(whole)
  println(fractional)
  println(words)
}
/* Output:
11
1.4
Twas Brillig
*/
  • [1] Sobald Sie ein val initialisieren, können Sie es nicht neu zuweisen. Wenn wir versuchen, whole eine andere Zahl zuzuweisen, meldet sich Kotlin mit der Nachricht “Val kann nicht neu zugewiesen werden.”

Beschreibende Namen für Ihre Bezeichner zu wählen, macht Ihren Code leichter verständlich und reduziert oft die Notwendigkeit für Kommentare. In Vals.kt haben Sie keine Ahnung, was whole repräsentiert. Wenn Ihr Programm die Zahl 11 speichert, um die Tageszeit darzustellen, zu der Sie Kaffee trinken, ist es offensichtlicher für andere, wenn Sie es coffeetime nennen, und leichter zu lesen, wenn es coffeeTime ist (gemäß dem Kotlin-Stil, bei dem wir den ersten Buchstaben klein schreiben).

  • -

vars sind nützlich, wenn sich Daten während der Ausführung des Programms ändern müssen. Dies klingt nach einer häufigen Anforderung, stellt sich jedoch in der Praxis als vermeidbar heraus. Im Allgemeinen sind Ihre Programme leichter zu erweitern und zu pflegen, wenn Sie vals verwenden. In seltenen Fällen ist es jedoch zu komplex, ein Problem nur mit vals zu lösen. Aus diesem Grund bietet Ihnen Kotlin die Flexibilität von vars. Je mehr Zeit Sie jedoch mit vals verbringen, desto mehr werden Sie entdecken, dass Sie vars fast nie benötigen und dass Ihre Programme ohne sie sicherer und zuverlässiger sind.

Übungen und Lösungen finden Sie unter www.AtomicKotlin.com.