Von Java zu Kotlin

Java war über lange Zeit die wichtigste Programmiersprache, die bei INNO eingesetzt wurde. Bedingt durch die Entwicklung dieser Sprache in der jüngeren Vergangenheit, war es für uns jedoch an der Zeit, nach Alternativen Ausschau zu halten. In Kotlin sind wir fündig geworden.

Als JVM Sprache ist Kotlin voll kompatibel mit dem Java-Ökosystem. Damit ist natürlich die erste wichtige Hürde genommen: Neuentwicklungen in Kotlin lassen sich reibungslos in die bestehende Java-Codebasis integrieren, deren aufwändige Reimplementierung in der neuen Sprache ist nicht nötig.

Vorteile von Kotlin

Aus Entwicklersicht bietet Kotlin deutliche Vorteile gegenüber Java. So fällt geschriebener Quellcode in Kotlin deutlich kürzer und prägnanter aus als in Java, ist dabei aber nicht weniger lesbar. Einiges kann dabei für jemanden mit Java-Hintergrund gewöhnungsbedürftig sein. So wird zum Beispiel per Konvention dazu angehalten, auf Semikolons zu verzichten. Auch werden Variablen per val (final) beziehungsweise var (nicht final) deklariert, Funktionen werden mit fun eingeleitet, if/else-Konstrukte können als Ausdrücke verwendet werden und einiges mehr.

Neben derartigen eher oberflächlichen Sprachmerkmalen, hat Kotlin auch Substantielleres zu bieten. So gibt es sogenannte Data Classes, die dem Autor beim Erzeugen von Datenhaltungsklassen das Ausschreiben von Gettern, Settern, hashCode(), equals() und toString() ersparen. Vielfach bestehen damit derartige Klassen nur aus einer Codezeile, wie beispielsweise:

data class FooBar(var foo: String, var bar: Int)

Eine weitere wichtige Eigenschaft der Sprache, die oft hervorgehoben wird, ist deren Umgang mit dem Wert null, beziehungsweise konkret dessen Abbildung im spracheigenen Typsystem. Angenommen es werden zwei Variablen s0 und s1 wie folgt deklariert:

var s0: String? = "this is nullable" var s1: String = "this is not"

Der Unterschied ist offensichtlich: s0 kann den Wert null haben, s1 jedoch nicht. In beiden Fällen ist es dem Compiler möglich, entsprechende Schutzmaßnahmen durchzusetzen, so dass NullPointerExceptions in aller Regel schon zur Kompilierzeit vermieden werden und nicht zur Laufzeit unangenehm auffallen. Die Zuweisung s1 = null würde zum Beispiel, zu einem Kompilierfehler führen, da sie gemäß der Typdeklaration unzulässig ist. Ähnliches gilt für den Ausdruck println(s0.length). Hier gibt es einige Möglichkeiten mit dem Fall umzugehen, dass s0 tatsächlich null ist. Verwendet werden kann, wie unten dargestellt, der Safe-Call-Operator ?, der Elvis-Operator ?:, ein if/else-Konstrukt oder sogar der Not-Null-Assertion-Operation !!.

println(s0?.length) // print the length or "null" println((s0 ?: "").length) // 
use empty string in case s0 is null println(if (s0 == null ) -1 else s0.length) 
println(s0!!.length) // asserts that s0 is in fact not null

Letzterer Operator ist mit Vorsicht zu genießen, da er wiederum die Möglichkeit für NullPointerExceptions eröffnet, wenn s0 in diesem Beispiel trotz der Zusicherung des Autors, tatsächlich null sein sollte.

Ein letztes Merkmal von dem Kotlin stark profitiert und das hier noch hervorgehoben werden soll, ist der Umgang der Sprache mit Funktionen. Grundsätzlich sind diese „erster Klasse“, sie können also wie Werte jedes anderen Typs benutzt werden und können damit zum Beispiel auch auf Paketebene (unabhängig von Klassen) abgelegt sowie anderen Funktionen als Parameter übergeben werden (Higher Order Functions). Daneben existieren weitere Mechanismen, wie die sogenannten Extension Functions, die den Programmieralltag erleichtern. Über sie ist es möglich eine Klasse, um statisch aufgelöste Funktionen zu erweitern, ohne die Klasse selbst zu modifizieren. Auf diesem Weg können etwa die klassischen „Utility“-Funktionen elegant umgesetzt werden:

fun String.shorten(): String = if (this.length > 3) this.substring(0..2) + 
"..." else this println("foobar".shorten()) // "foo..."

Aus diesen und weiteren Gründen hat sich Kotlin bei INNO als die bessere Lösung etabliert, serverseitig zu entwickeln. Nun ist Kotlin aber plattformübergreifend ausgelegt und kann dementsprechend unter anderem auch für Android- und Web-Projekte herangezogen werden. Darüber hinaus wird von JetBrains, den Designer der Sprache, die Möglichkeit ausgebaut, sogenanntes Multiplatform Programming zu betreiben. Hierbei kann Code zwischen unterschiedlichen Plattformen geteilt werden. Wegen alledem hoffen wir, Kotlin in Zukunft noch umfassender einsetzen zu können.

Bis dahin sei jedem Interessiertem nahegelegt, die Sprache zum Beispiel über Kotlin Koans auszuprobieren. Wir versprechen eine sehr flache Lernkurve.

Have fun. Enjoy coding.
Your INNO coding team.