Programmiersprache: Kotlin 1.4.30 bereitet Value Classes und neues Backend vor

Die derzeit als Beta gekennzeichneten Neuerungen für Inline Classes und das JVM-Backend sollen in Kotlin 1.5 stabil sein.

In Pocket speichern vorlesen Druckansicht 18 Kommentare lesen
Lesezeit: 4 Min.
Inhaltsverzeichnis

JetBrains hat Kotlin 1.4.30 veröffentlicht. Das Release bringt einige als Beta gekennzeichnete Funktionen mit, die auf Version 1.5 der Programmiersprache vorbereiten. Dazu gehören die Inline Classes und ihr Einsatz als Value Classes. Unter der Haube bringt das Release ein optional nutzbares neues JVM-Backend (Java Virtual Machine) mit. Im Zusammenspiel mit Java lassen sich zudem die JVM-Namen für Aufrufe über Annotationen ändern.

Das Konzept der Inline Classes hat Kotlin in Version 1.3 als Alpha eingeführt, und im aktuellen Release sind sie als Beta gekennzeichnet. Sie haben nichts mit den verschachtelten Inner Classes zu tun, sondern lassen sich als Wrapper für einen Wert nutzen, um Compileroptimierungen zu ermöglichen. Als Werte sind sowohl primitive Typen wie Int als auch Referenztypen wie String erlaubt.

Für folgenden Code aus dem JetBrains-Blog

inline class Color(val rgb: Int)

fun changeBackground(color: Color) 
val blue = Color(255)
changeBackground(blue)

kann der Compiler auf das Allozieren eines Objekts verzichten und die Methode changeBackground mit einem veränderten Namen und Int statt eines Objekts der Klasse Color umsetzen. Für den Aufruf kann er schließlich auf zusätzliche Wrapper zum Auflösen verzichten und direkt den konstanten Wert 255 übergeben:

fun changeBackground-euwHqFQ(color: Int) 
changeBackground-euwHqFQ(255) // no extra object is allocated!

Das Anpassen beziehungsweise Mangeln (Mangle) des Namens beim Kompilieren ist aus zwei Gründen erforderlich: Zum einen kann das System damit unterschiedliche Varianten von Inline-Klassen umsetzen und zum anderen verhindert der geänderte Name einen versehentlichen Aufruf aus Java.

Bisher sind Inline-Klassen ein spezielles Sprachfeature von Kotlin, das Java nicht kennt. Allerdings bereitet das aktuelle Release auf das Zusammenspiel mit den Value Classes aus dem experimentellen OpenJDK-Projekt Valhalla vor. Für die Integration einer solchen Klasse ist lediglich eine andere Syntax erforderlich, die das Schlüsselwort inline durch value austauscht und eine zusätzliche Annotation nutzt:

@JvmInline
value class Color(val rgb: Int)

Kotlin 1.5 soll neben der annotierten Umsetzung der Inline-Klassen das vollständige Konzept der Value Classes umsetzen. Damit wird es möglich sein, sie nicht nur mit einer, sondern mehreren Properties zu definieren.

Daneben sollen auch die in Project Valhalla definierten Primitive Classes Einzug in Kotlin halten. Damit kann der Compiler beispielsweise Arrays solcher Objekte als feste Werte im Speicher ablegen statt als Referenzen wie bei regulären Klassenobjekten.

Das jüngste Java-Release 15 hat Records mitgebracht, die allerdings derzeit noch als Preview gelten. Sie dienen zum Speichern unveränderlicher Daten (Immutable Data) und ähneln damit den data-Klassen von Kotlin. JetBrains Programmiersprache betrachtet im Zusammenspiel mit Java die Records als Klassen mit Kotlin-Properties. Außerdem sorgt die Annotation @JvmRecord für data-Klassen dafür, dass der Compiler die benötigten Record-Methoden zum Zugriff auf die Properties generiert.

Versiegelte Klassen kannte Kotlin bereits, bevor auch sie als Preview in Java 15 Einzug hielten. Kotlin 1.4.30 bereitet nun darauf vor, dass in Version 1.5 auch Interfaces als sealed deklariert werden dürfen. Unterklassen davon müssen unabhängig davon, ob sie ebenfalls versiegelt sind oder nicht, im selben Paket, aber nicht notwendigerweise in derselben Datei liegen.

Unter der Haube hält ein neues JVM-Backend Einzug in Kotlin. Das Team arbeitet bereits seit geraumer Zeit an der Umsetzung, die mit dem aktuellen Release als Beta gekennzeichnet ist. Mit Kotlin 1.4.30 können Entwicklerinnen und Entwickler es für ihre Projekte verwenden. Details zu den benötigten Anpassungen für Gradle beziehungsweise Maven finden sich in einem Blogeintrag. Das neue JVM-IR-Backend (Intermediate Representation) soll unter anderem die Entwicklung neuer Sprachfeatures beschleunigen und ab Kotlin 1.5 standardmäßig zum Einsatz kommen.

Eine weitere Neuerung für das Zusammenspiel mit Java sind Annotationen zum Ändern eines Funktionsnamens im Bytecode. Die Funktion

@JvmName("greetAfterTimeoutMillis")
fun greetAfterTimeout(timeout: Timeout)

lässt sich aus Java über den in der Annotation definierten Methodennamen aufrufen

greetAfterTimeoutMillis(2000);

während der Aufruf aus Kotlin weiterhin über den eigentlichen Funktionsnamen erfolgt

greetAfterTimeout(2.seconds)
Kotlin: von der JVM zur Multiplattform

(Bild: JetBrains)

Ursprünglich hatte JetBrains die Programmiersprache als Alternative zu Java ins Rennen geschickt. In den Anfängen war die Sprache auch auf die JVM begrenzt. Besonders auf Android hat sie einen Siegeszug angetreten, seit Google sie 2017 offiziell als Alternative zu Java auch in Android Studio aufgenommen 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 die Sprache anfänglich maßgeblich entwickelt.

Weitere Neuerungen in Kotlin 1.4.30 lassen sich dem Kotlin-Blog entnehmen. Nutzer von IntelliJ IDEA erhalten automatisch eine Update-Meldung, während das Plug-in für Android Studio Arctic Fox noch in Arbeit ist.

(rme)