A Einführung in Kotlin 

Sie kennen schon eine Programmiersprache und möchten sich kompakt über die Syntax und die wichtigsten Konzepte von Kotlin informieren? Dieser Anhang bietet einen schnellen Überblick.
Im Juli 2011 stellte die in Sankt Petersburg ansässige Firma JetBrains »Project Kotlin« als Sprache für die Java Virtual Machine (JVM) vor. Kotlin-Quelltext wird hierzu in Java-Bytecode übersetzt. Seit Februar 2012 ist Kotlin Open Source und steht unter der Apache-2-Lizenz. Die nach einer russischen Insel im Finnischen Meerbusen (30 km westlich von Sankt Petersburg in der Ostsee gelegen) benannte Sprache ist statisch typisiert und objektorientiert. Sie kann bei Bedarf nach JavaScript transpiliert werden. Die Technologie Kotlin/Native ermöglicht zudem die Ausführung auf Plattformen ohne virtuelle Maschine, beispielsweise iOS, sowie den Raspberry Pi. Ein LLVM[ 18 ](https://llvm.org/)-basiertes Compiler-Backend erzeugt dann Maschinensprache.
A.1 Überblick 

Kotlin möchte eine moderne Alternative zu Java sein. Ihre Syntax ist zu Java nicht kompatibel. Allerdings spielt die Interoperabilität eine wichtige Rolle. So können vorhandene Java-Bibliotheken in vollem Umfang genutzt werden. Seit Googles Entwicklermesse IO 2017 wird die Sprache offiziell in Android Studio unterstützt. Und zwei Jahre später löste Kotlin Java als bevorzugte Sprache für neue App-Projekte ab. Auch außerhalb von Android findet Kotlin immer mehr Freunde und wird oft für das Erstellen von Geschäftsanwendungen und Microservices verwendet. Neben IntelliJ und Android Studio können unter anderem Eclipse, NetBeans sowie Visual Studio Code für das Entwickeln mit Kotlin verwendet werden.
A.1.1 Hello, Kotlin 

Wenn Sie außerhalb eines App-Projekts mit Kotlin experimentieren möchten, bietet sich die Seite https://play.kotlinlang.org/ (Abbildung A.1) an.
Dort können Sie Code ausprobieren, ohne weitere Software herunterladen und installieren zu müssen. Ein sehr einfaches Beispiel zeigt Listing A.1.
Abbildung A.1 Der offizielle Kotlin-Onlinespielplatz
Alternativ können Sie in Android Studio sogenannte Scratch Files verwenden, um Kotlin-Codeschnipsel auszuprobieren. Scratch Files werden mit File • New • Scratch File erzeugt. Die daraufhin angezeigte Auswahlliste New Scratch File ist in Abbildung A.2 zu sehen.
Bitte beachten Sie, dass das File-Menü nur zugänglich ist, wenn das Hauptfenster angezeigt wird, nicht aber über den Willkommensbildschirm. Sie müssen deshalb ein Projekt geöffnet haben.
Abbildung A.2 Ein neues Scratch File erzeugen
Ein Klick auf Kotlin öffnet das Scratch File in einem Editorfenster (Abbildung A.3). Die Checkboxen Interactive mode und Use REPL steuern, wann Codeänderungen übernommen und welche Bereiche des Quelltextes neu ausgewertet werden. Für den Einstieg empfehle ich Ihnen, beide zu deaktivieren und nach Ihrer Eingabe einfach den grünen Play-Button in der linken oberen Ecke des Editorfensters anzuklicken. Scratch Files werden im Werkzeugfenster Project unterhalb des Knotens Scratches and Consoles • Scratches angezeigt. Allerdings muss hierzu die Sicht Project aktiv sein.
Abbildung A.3 Ein Kotlin-Scratch File in Android Studio
Die Funktion main() bildet den Einstiegspunkt in Kotlin-Programme. Sie gehört nicht zu einer Klasse und wird in einer beliebigen Datei mit der Endung .kt abgelegt. Solche Funktionen werden Toplevel-Funktionen genannt. Die aufgerufene Funktion print() gibt den übergebenen Text ohne Zeilenumbruch aus.
fun main() {
print("Hello, Kotlin")
}
Listing A.1 Das »Hello, world«-Beispiel in Kotlin
Neben Toplevel-Funktionen gibt es auch Toplevel-Variablen, also Variablen ohne Bezug zu einer Klasse.
val greeting = "Hello, Kotlin"
fun main() {
println(greeting)
}
Listing A.2 Ausgabe einer Toplevel-Variablen
Der Play-Button im Scratch-File-Editorfenster ruft nicht die main()-Funktion auf, sondern beginnt nur mit der Auswertung des Codeschnipsels. Beim Nachvollziehen meiner Beispiele müssen Sie deshalb in der letzten Zeile Ihrer Eingabe mit main() selbst für den Aufruf sorgen.
Kommentare und Dokumentation
Wenn Sie Ihr Programm mit Kommentaren versehen möchten, stehen Ihnen die aus vielen anderen Sprachen bekannten Zeilen- (// ...) und Blockkommentare (/* ... */) zur Verfügung. Die Sprache zur Erstellung von Dokumentation wird analog zu Java KDoc[ 19 ](https://kotlinlang.org/docs/reference/kotlin-doc.html) genannt. Das korrespondierende Kommandozeilentool heißt Dokka. KDoc-Dokumentation beginnt mit /** und endet mit */. Jede Kommentarzeile kann mit einem * beginnen. Dieser gehört nicht zu dem Kommentartext. Block Tags beginnen mit @ und beschreiben unter anderem Parameter (@param) und Rückgabewerte (@return).
Konventionen
Dateinamen folgen dem CamelCase-Muster. Die in Java übliche Regel »Jede Klasse in ihre eigene .java-Datei« gibt es in Kotlin nicht. Sie könnten deshalb beliebig viele Funktionen oder Klassen in einer Quelltextdatei zusammenfassen. Ratsam ist das aber nicht. .kt-Dateien sollten nur Code enthalten, der inhaltlich eine Einheit bildet. Mehr als ein paar Hundert Zeilen Quelltext sind ohnehin kaum noch zu überblicken. Aber das gilt für alle Programmiersprachen.
Paketnamen werden vollständig kleingeschrieben. Sie enthalten keine Unterstriche. Paket-Definitionen beginnen mit dem Schlüsselwort package und bilden die erste Anweisung des Quelltextes (nach etwaigen Kommentarzeilen mit Lizenz- oder Copyrightinformationen). Namen von Klassen und Objekten beginnen mit einem Großbuchstaben und folgen dem CamelCase-Muster. Namen von Funktionen, Eigenschaften und lokalen Variablen beginnen mit einem Kleinbuchstaben und folgen dem camelCase-Muster. Sie enthalten keine Unterstriche.
Weitere Informationen finden Sie unter https://kotlinlang.org/docs/reference/coding-conventions.html.
A.1.2 Beim Start Argumente übergeben 

Wenn Sie einem Programm beim Start Parameter übergeben möchten, sieht die main()-Funktion aus, wie in Listing A.3 zu sehen. Sie erhält einen Parameter, nämlich ein Feld mit Zeichenketten. Die Klasse Array enthält unter anderem die Methode forEach(). Für jedes Element wird eine sogenannte Aktion aufgerufen. Das ist der Lambda-Ausdruck in geschweiften Klammern. Das Beispiel gibt nur das Element aus. Es wird dem Code über die Variable arg mitgegeben.
fun main(args: Array<String>) {
args.forEach( { arg -> println(arg) })
}
Listing A.3 Beim Start Parameter übergeben
Anders als beispielsweise in Java beginnen Variablendefinitionen nicht mit dem Typ, sondern dem Bezeichner. Beide sind durch einen Doppelpunkt getrennt: args: Array<String>. Außerhalb von Funktions- bzw. Methodensignaturen müssen Sie den Ausdruck mit var (mehrfache Zuweisungen sind erlaubt) oder val (der Variable kann nur einmal ein Wert zugewiesen werden) beginnen. Zum Schluss kommt der Wert, den die Variable annehmen soll.
var i: Int = 42
var j: String = "Hallo"
val k: Double = 3.14
Wenn Kotlin den Typ durch den zugewiesenen Ausdruck ermitteln kann, braucht er nicht angegeben zu werden. Diese Fähigkeit wird Typinferenz genannt.
var i = 42
var j = "Hallo"
val k = 3.14
Funktionsparameter sind in Kotlin unveränderlich. In Java müssen sie hingegen explizit auf final gesetzt werden. Deshalb ist Listing A.4 nicht korrekt (»Val cannot be reassigned«).
fun main(args: Array<String>) {
args = emptyArray<String>()
}
Listing A.4 Zuweisungen an Funktionsparameter sind nicht zulässig
Die Funktion emptyArray() erzeugt ein leeres Feld des angegebenen Typs. Welche Datentypen Kotlin kennt, sehen wir uns im folgenden Abschnitt etwas genauer an.