Programmiersprache: Kotlin 1.3.50 kann Java-Code besser umwandeln

Außer dem überarbeiteten Java-to-Kotlin-Konverter gibt es erweiterte APIs zum Messen von Zeiträumen und für die Bit-Manipulation in den Standard Libraries.

In Pocket speichern vorlesen Druckansicht 46 Kommentare lesen
Programmiersprache: Kotlin 1.3.50 kann Java-Code besser umwandeln
Lesezeit: 5 Min.
Von
  • Rainald Menge-Sonnentag
Inhaltsverzeichnis

JetBrains hat mit Kotlin 1.3.50 das fünfte Release der 1.3-Serie veröffentlicht. Neuerungen in den APIs gibt es in den Standard-Libraries. Darüber hinaus lag der Fokus auf der Verbesserung der Anbindung an die ebenfalls von JetBrains stammende Entwicklungsumgebung IntelliJIDEA. Dazu gehört ein erweiterter Java-to-Kotlin-Konverter und das Debuggen von Kotlin/Native-Code.

Die Versionsnummer mag ein wenig verwirren, da bei Kotlin die Punkt-Releases jeweils als 1.n beginnen und daraufhin in Zehnersprüngen bei Zwanzig beginnend weitere Minor Feature Releases folgen. Auf das im Oktober vergangenen Jahres erschienene Kotlin 1.3 folgten somit vor dem aktuellen Release im Januar 1.3.20, im April 1.3.30 und im Juni 1.3.40. Mit den Informationen zum aktuellen Release hat JetBrains auch erste Änderungen für Kotlin 1.4 angekündigt, die sich auf den Umgang mit Nullable Types beziehen.

Eine neue API zum Messen von Zeiträumen soll Missverständnisse beziehungsweise Programmierfehler durch das Verwenden falscher Einheiten vermeiden. Daher setzt Kotlin nun auf eigene Klassen und zwar Inline-Klassen, um zusätzliches Allozieren zu vermeiden. Entwickler können Duration als Parameter für Methoden verwenden und müssen beim Aufruf explizit die Einheit spezifizieren, wie in folgendem Beispiel aus dem Kotlin-Blog:

import kotlinx.coroutines.delay
import kotlin.time.*

@ExperimentalTime
suspend fun greetAfterTimeout(duration: Duration) {
delay(duration.toLongMilliseconds())
println("Hi!")
}

@UseExperimental(ExperimentalTime::class)
suspend fun main() {
greetAfterTimeout(100.milliseconds)
greetAfterTimeout(1.seconds)
}

Durch die neue Form des ist deutlich, dass der erste Aufruf für Duration 100 Millisekunden und der zweite eine Sekunde übergibt. Der Code zeigt darüber hinaus, dass die API bisher noch als experimentell gekennzeichnet ist.

Dasselbe gilt für die neue MonoClock, die wie der Name naheliegend eine gleichbleibende Uhr (Monotonic Clock) repräsentiert. Sie gilt als empfohlenes Werkzeug zum Messen von Zeiträumen innerhalb eines Programms, da sie unabhängig von der Systemzeit misst. Letztere ist während eines Programmverlaufs nicht garantiert gleichbleibend, da Nutzer oder Software sie jederzeit ändern können.

MonoClock implementiert das Clock-Interface zum Messen der Zeit. Unter anderem bringt die API eine Art Stoppuhrfunktion über die Methoden val mark = clock.markNow() zum Setzen eines Markers und der späteren Abfrage der seitdem abgelaufenen Zeit über mark.elapsedNow().

Eine weitere Ergänzung der Standard Libraries, die ebenfalls noch als experimentell gekennzeichnet ist, bringt eine API zur Bitmanipulation mit Funktionen wie rotateLeft(n) und rotateRight(n) zum Ändern sowie countOneBits() oder countTrailingZeroBits() zum Abfragen von Bitmustern.

JetBrains bietet einen neuen Java-to-Kotlin-Konverter für IntelliJ IDEA an. Das neue Tool hat derzeit Preview-Status, und Entwickler müssen ihn über den Parameter Use New J2K (experimental) in den Einstellungen manuell aktivieren. Der Fokus lag auf dem verbesserten Umgang mit Nullable Types (auf NULL festlegbare Typen). Der bisherige Konverter erzeugt fast immer Nicht-Nullable-Types und erforderte damit viel Nacharbeit, was wiederum häufig zu Laufzeitfehlern führt.

Der neue Konverter versucht aufgrund des Umgangs mit dem jeweiligen Typ im Java-Code zu erschließen, ob er in Kotlin Nullable sein soll. Ziel ist, die Anzahl der Compiler-Fehler zu verringern und besser zugänglichen Kotlin-Code zu erstellen. Gleichzeitig behebt der Konverter wohl einige bekannte Fehler unter anderem bei der impliziten Typumwandlung.

Für Kotlin 1.4 plant JetBrains einige Änderungen bei der NULL-Überprüfung. Bisher gibt es unterschiedliche Formen von Exceptions beim Auftreten der Ausnahmezustände: KotlinNullPointerException, IllegalStateException, IllegalArgumentException und TypeCastException.

Künftig tritt für die meisten Fälle die java.lang.NullPointerException auf – Ausnahmen sind unter anderem explizite Überprüfung über Library-Aufrufe wie checkNotNull oder requireNotNull. Auch wenn sich damit der Exception-Typ ändert, liefert er dieselben Informationen, sodass sich aus Entwicklersicht wenig ändern sollte.

Für das Zusammenspiel mit IntelliJ gibt es zudem Verbesserungen beim Debugger, der in der Variables View nur die jeweils relevanten Variablen hervorhebt. Das soll vor allem innerhalb von Lambdas die Übersicht verbessern. Außerdem kennt der Editor neue Intentions und Inspections und schlägt beispielsweise das Verwenden der Property indices an Stellen im Sourcecode vor, die manuelle Indizes aufweisen.

Der Debugger zeigt nun Variablen in Lambdas übersichtlich und korrekt an.

(Bild: JetBrains)

Das Ende 2017 vorgestellte Kotlin/Native zum Erstellen plattformspezifischer Binaries statt Codes für die JVM zieht nun zumindest bei der Versionierung mit Kotlin gleich und hat somit auch die Nummer 1.3.50. Das aktuelle Release bringt unter anderem Erweiterungen bei der Anbindung an Frameworks unter iOS und macOS. Die Standard Library erlaubt zudem neuerdings den Einsatz von kotlin.reflect.typeof() für Kotlin/Native-Typen. Außerdem können Entwickler mit der Ultimate Edition von IntelliJ IDEA nun Kotlin/Native-Code debuggen.

Zum Debuggen von Kotlin/Native-Anwendungen ist IntelliJ IDEA Ultimate erforderlich.

(Bild: JetBrains)

Weitere Neuerungen in Kotlin 1.3.50 unter anderem für die Übersetzung in JavaScript lassen sich dem JetBrains-Blog entnehmen. (rme)