×

Kotlin: Das bessere Java?

„Kotlin ist das bessere Java“. Auf derartige Thesen stößt man schnell, wenn man in der Suchmaschine nach der gleichnamigen Insel sucht [7]. Denn die Programmiersprache Kotlin erfreut sich wachsender Beliebtheit und dafür gibt es einige gute Gründe.

Einführung

JetBrains, die Entwickler der bekannten Entwicklungsumgebung IntelliJ IDEA, haben mit Kotlin eine moderne quelloffene Programmiersprache geschaffen, die neue und bewährte Programmierkonzepte in einer Sprache vereint. Dabei kann Kotlin ähnlich wie Scala auf der Java Virtual Machine (JVM) ausgeführt werden. Ein Vorteil ist dabei, dass Java-Code und Java-Bibliotheken von Kotlin direkt verwendbar sind und somit die Einführung von Kotlin in bestehende Java-Projekte möglich ist. Darüber hinaus kann Kotlin auch in JavaScript übersetzt werden, was z.B. die Entwicklung von WebApps mit einer effektiven Programmiersprache erlaubt. Durch die Kombination dieser Aspekte lassen sich sowohl Server- als auch Client-Komponenten in der selben Sprache schreiben (ohne dabei JavaScript verwenden zu müssen).
Seit 2017 ist Kotlin offizielle Programmiersprache für Android Apps [8]. Damit sollen die Vorteile moderner Programmiersprachen auch in der Android-Entwicklungen nutzbar werden. Nicht zuletzt dieser Schritt von Google bescherte Kotlin einen rasanten Anstieg in der Popularität [5].

Sprach-Features

Kotlin liefert eine Vielzahl von syntaktischen Features, um den Code sicher, nachvollziehbar und effektiv zu gestalten. Zum Beispiel lassen sich durch das Schlüsselwort data sogenannte Datenklassen definieren. Objekte dieses Klassentyps besitzen automatisch Funktionalitäten, die der Implementierung der Methoden equals(…), hashCode(), clone() sowie der toString()in Java entsprechen, wobei auch alle get*() und set*(…) Methoden implizit vorhanden sind. Der Vergleich zum Java-Code (rechts) mit dem gleichwertigen Kolin-Code (links) demonstriert die Effizienzsteigerung.

Einer der häufigsten Laufzeitfehler in Java-Programmen ist die unerwartete NullPointerException (NPE). Kotlin hat es sich zum Ziel gemacht, diesen Fehlertyp zu reduzieren, in dem Kotlin den Umgang mit null syntaktisch reglementiert. Funktionen oder Variablen, die null als gültigen Wert erhalten oder zurückliefern dürfen, müssen ein ? an der Typendeklaration besitzen. Ohne das ? ist null kein gültiger Wert. Hier wird bereits eine potentielle Zuweisung oder Rückgabe von null durch einen Compile-Fehler verhindert.

var notNullablePerson: Person = Person("Hans", "Müller")  // Neue Instance, null nicht erlaubt
var nullablePerson:    Person? = null                     // durch das ? am Typ ist null erlaubt

Ist ein Objekt bewusst als „nullable“ deklariert, darf nur mit einem vorhergehenden Null-Check auf den Inhalt zugegriffen werden, um NPEs zu verhindern. Als Alternative bietet sich der Safe-Call-Operator ?. an, der den Null-Check übernimmt und im Falle eines NullPointers direkt null als Ausdruckswert zurückliefert. Optional erlaubt der Elvis-Operator ?: die Rückgabe eines alternativen Wertes.

val currentLastName: String? = nullablePerson?.lastName
val currentFirstName: String = nullablePerson?.firstname ?: "UNKNOWN"
if (nullablePerson != null) {
    val stringRepresentation = nullablePerson.toString()
}

Ein weiteres nennenswertes Feature sind Extension Functions. Sie erlauben die nachträgliche Erweiterung bestehender Klassen um neue Funktionen, ohne Vererbung nutzen zu müssen. Auf diese Weise lassen sich zum Beispiel eingebundene Bibliotheken um eigene Funktionalitäten flexibel erweitern.

fun String.parseInt(): Int = Integer.parseInt(this)   // Extension Function für String

fun main(args: Array) {
    val x = "22".parseInt() + 20        // String besitzt nun oben definierte Methode "parseInt"
    println(x)                          // Ergebnis: 42
}

Diese Technik wird von der Kotlin-Standard-Bibliothek selbst ausgiebig eingesetzt, um die Standard-Bibliothek von Java um zahlreiche Funktionen zu erweitern. So ist das oben gezeigte Beispiel in der Praxis nicht nötig, da Strings in Kotlin Extension Functions wie toInt(), toIntOrNull(), toDouble() usw. bereits besitzen.

Praxistest

Die Fähigkeit, Kotlin als JVM-Sprache und gleichzeitig auch als JavaScript-Alternative verwenden zu können, haben wir dazu genutzt, ein Spiel zu entwickeln, das sowohl als Android App als auch als WebApp gespielt werden kann. Beide Varianten nutzen den selben zentralen Kotlin-Code (Core), der für den Spielverlauf verantwortlich ist. Die Apps selbst sind spezifisch für die jeweilige Plattformen implementiert und basieren ebenfalls auf Kotlin.

Als Entwicklungsumgebung kamen Eclipse, Android Studio und IntelliJ IDEA zum Einsatz. Eclipse wurde zur Core-Entwicklung genutzt und unterstützt Kotlin zur Zeit nur durch ein Plugin. Leider zeigten sich in der verwendeten Version deutliche Schwächen, so dass Eclipse zur Kotlin-Entwicklung bislang nur eingeschränkt empfohlen werden kann.

Besser sah es jedoch bei IntelliJ IDEA aus, die Entwicklungsumgebung von den Machern von Kotlin. Ohne weitere Plugins konnten wir die umfangreiche IDE für die WebApp Erstellung verwenden. In JavaScript übersetzt ermöglicht Kotlin den Zugriff auf den HTML-DOM sowie auf Java-Script Funktionen, so dass Web-Entwickler auf bekannte Strukturen zurückgreifen können. Darüber hinaus bietet die kotlinx.html Bibliothek eine Art HTML-DSL an, um typsicher und übersichtlich DOM-Manipulationen in Kotlin zu erlauben.

Insbesondere bei der Android-Entwicklung steigt die Relevanz von Kotlin stetig [1]. Android Studio, die Android-Entwicklungsumgebung die auf IntelliJ basiert, bietet sofortige und umfassende Kotlin-Unterstützung an, darunter ein automatischer Code-Konverter. Auch die Android-Tutorials nutzen immer häufiger Kotlin zur Demonstration oder erlauben den Wechsel zwischen Java- und Kotlin-Beispielen [3].

Fazit

Wer mit Java und insbesondere mit Android Entwicklung zu tun hat, sollte sich Kotlin genauer ansehen. Es bietet zahlreiche Funktionen und Möglichkeiten, die Entwicklung effizienter und sicherer zu gestalten. Auf bereits existierender Java-Implementierungen muss dabei nicht verzichtet werden. Die Kotlin/Native-Erweiterung erlaubt zudem die Kompilierung von Kotlin-Programmen für weitere Betriebssysteme, und die Übersetzbarkeit in JavaScript eröffnet neue Möglichkeiten für die Web-Entwicklung. Ein genauerer Blick könnte sich also für jeden Software-Entwickler lohnen.

Autoren

Max Hoffmann & Gerald Winter

Quellen

[1] Realm Report, Facts and Trens in Mobile Computing: https://realm.io/realm-report/2017-q4/
[2] Kotlin Programming Language: https://kotlinlang.org/
[3] Build your first app (Android): https://developer.android.com/training/basics/firstapp/
[4] Kotlin zweit beliebteste Sprache 2018: https://insights.stackoverflow.com/survey/2018
[5] State of Kotlin 2018 // Developers love Kotlin: https://pusher.com/state-of-kotlin
[6] Introduction to Kotlin (Google I/O ’17): https://www.youtube.com/watch?v=X1RVYt2QKQE
[7] Ist Kotlin das bessere Java? Eine Einführung: https://www.informatik-aktuell.de
[8] Google announces Kotlin for Android | Google I/O 2017: https://www.youtube.com/watch?v=d8ALcQiuPWs

Von Gerald Winter | 23.10.2018
Gerald Winter

Softwareentwicklung