Programmiersprache: Kotlin 1.6 versiegelt when-Anweisungen

Neben vollständigen when-Anweisungen bringt das Release Erweiterungen für unterbrechende Funktionen und ein neues Speichermanagement für Kotlin/Native.

In Pocket speichern vorlesen Druckansicht 62 Kommentare lesen
Luftbild einer Insel

Die Programmiersprache Kotlin ist nach der gleichnamigen russischen Insel benannt.

(Bild: news.ifmo.ru)

Lesezeit: 5 Min.
Inhaltsverzeichnis

JetBrains hat mit Kotlin 1.6 das zweite Feature-Release der Programmiersprache in diesem Jahr veröffentlicht. Die Version stabilisiert vor allem in 1.5.x als experimentell eingeführte Sprach-Features wie vollständige when-Anweisungen und unterbrechende Funktionen als Elterntypen.

Ab Kotlin 1.6 lassen sich die API-Versionen der jeweils drei statt bisher zwei vorangegangenen Feature-Releases verwenden. Es arbeitet somit ebenso wie Kotlin 1.5 mit den API-Versionen 1.3, 1.4 und 1.5 zusammen.

Die versiegelten (sealed) oder auch vollständigen (exhaustive) when-Anweisungen waren in Version 1.5.30 als Preview an Bord. Versiegelt bedeutet, dass die Anweisungen für alle möglichen Fälle einen Zweig aufweisen müssen, wobei im Zweifel ein else-Block die nicht behandelten Fälle abdeckt.

Bei unvollständigen when-Anweisungen spuckt der Compiler ab sofort folgende Warnung aus:

Non-exhaustive 'when' statements on sealed class/interface 
will be prohibited in 1.7. Add an 'is InstantMessage' branch
or 'else' branch instead.

Derzeit lässt sich der Code mit der Warnung kompilieren, aber ab Kotlin 1.7 soll der Compiler mit einer Fehlermeldung abbrechen.

Eine weitere Neuerung war ebenfalls in Version 1.5.30 als Preview dabei und gilt nun als stabil: Mit Version 1.6 sind unterbrechende Funktionen als Elterntyp erlaubt. Die mit suspend gekennzeichneten Funktionen können in nebenläufigen Programmen eingesetzt werden, um die Ausführung von Koroutinen zu unterbrechen. So können sie beispielsweise auf die Übertragung einer Datei über das Netzwerk warten, ohne den aktuellen Thread zu blockieren. Das Konzept der Koroutinen kennt Kotlin seit Version 1.1.

Außerdem stabilisiert Kotlin 1.6 die Umwandlung eines regulären zu einem unterbrechenden Funktionstypen. Bei der Übergabe eines passenden regulären Typs an eine Funktion, die als Parameter einen unterbrechenden Funktionstyp erwartet, wandelt der Compiler sie automatisch um.

Die auf die Java Virtual Machine ausgelegte Variante der Programmiersprache Kotlin/JVM setzt ab dem aktuellen Release wiederholbare Annotationen sprachübergreifend zu Java ein, das Repeatable Annotations seit Java 8 kennt. Kotlin erkennt damit die Java-Annotationen, und über @kotlin.annotation.Repeatable gekennzeichnete Kotlin-Funktionen gelten umgekehrt für Java.

Für Kotlin/Native steht mit dem aktuellen Release der erstmals im Sommer 2020 vorgestellte neue Memory Manager zur Verfügung. Er soll eine effizientere Nachverfolgung der Speichernutzung und Freigabe ungenutzter Speicherbereiche als das traditionelle Speichermanagement bringen. Zudem zielt er auf eine verbesserte Speicherverwaltung bei der nebenläufigen Programmierung, womit unter anderem Einschränkungen beim Teilen von Objekten zwischen Threads wegfallen.

Die Standard Library von Kotlin bringt eine neue Funktion zum Lesen von Inputs: readln() wirft eine Exception, wenn mit EOF das Ende der Eingabequelle erreicht ist. Damit entfällt das für readLine() erforderliche Überprüfen der Quelle auf null. Die ebenfalls neue Funktion readlnOrNull() verhält sich wie das bisherige readLine(), zeigt die mögliche null aber im Namen an. Die neuen Eingabefunktionen sind zudem namentlich konsistent zu der Ausgabefunktion println().

Die Duration-API hatte bereits in Kotlin 1.5 einige Ergänzungen erfahren. Mit Kotlin 1.6 sind die letzten offenen Aufgaben unter der Haube abgeschlossen, womit die API nun als stabil gilt. Unter anderem ist die days-Komponente der Funktion toComponents neuerdings als Long- statt als Int-Wert angelegt. Die in 1.5.30 als Preview gekennzeichneten erweiterten Funktionen zum Umwandeln in einen String über Duration.toString() sowie umgekehrt zum Parsen einer Zeichenkette gelten nun als stabil.

Daneben erreichen zahlreiche weitere Funktionen der Standardbibliothek mit Kotlin 1.6 einen stabilen Stand, darunter typeOf(), die bitweise Rotation über rotateLeft() und rotateRight() sowie die Collection-Builder-Funktionen buildMap(), buildList() und buildSet().

Zehn Jahre Kotlin

Die Programmiersprache hat am 19. Juli ihren zehnten Geburtstag gefeiert. In den Anfängen war Kotlin auf die Java Virtual Machine (JVM) begrenzt. Besonders auf Android hat sie einen Siegeszug angetreten, seit Google sie 2017 offiziell als Alternative zu Java auch in Android Studio aufgenommen und zwei Jahre später zur ersten Wahl für das mobile Betriebssystem erklärt hat. Inzwischen ist die Programmiersprache aber auf diverse Plattformen ausgelegt: Kotlin/Native ermöglicht die Ausführung ohne virtuelle Maschine, vor allem um Plattformen wie iOS abzudecken, die von Haus aus keine JVM an Bord haben.

Mit Kotlin/JS ist zudem eine Anbindung an JavaScript verfügbar, und seit Kotlin 1.2 lassen sich Multiplattformprojekte erstellen, die mit einer Codebasis JVM und JavaScript abdecken. Den Namen, der hierzulande gerne Trolle in Foren anzieht, verdankt die Sprache einer Insel vor St. Petersburg. Das dortige JetBrains-Team hat Kotlin anfänglich maßgeblich entwickelt.

Vor einem Jahr hat JetBrains den Releasezyklus für Kotlin geändert. Das Unternehmen veröffentlicht planmäßig alle sechs Monate ein Feature-Release mit der Versionierung 1.x. Inkrementelle Releases mit der Versionsnummer 1.x.y0 (1.6.10, 1.6.20, ...) sollen alle zwei bis drei Monate erscheinen, und Bugfix-Releases folgen nach Bedarf mit der Versionierung 1.x.yz (1.6.11, 1.6.12, ...).

Weitere Neuerungen in Kotlin 1.6 wie die Anbindung des experimentellen Gradle-Plug-in Kover zum Ermitteln der Codeabdeckung lassen sich dem Kotlin-Blog entnehmen. IntelliJ IDEA sollte automatisch ein Update zur aktuellen Version vorschlagen. Dasselbe gilt für das auf IntelliJ IDEA basierende Android Studio. Der separate Compiler für die Kommandozeile findet sich auf GitHub.

(rme)