© Liashko/Shutterstock.com
Kotlin in der Mobile-Entwicklung

Die pragmatische Alternative für Android


Die ohnehin nicht für schnelle Evolution bekannte Programmiersprache Java ist für viele Android-Entwickler aus Gründen der Rückwärtskompatibilität bei Version 6 stehen geblieben. Erst mit Veröffentlichung von Android 7 alias Nougat stehen Android-Entwicklern die Sprachfeatures von Java 8 zur Verfügung. Vor diesem Hintergrund versuchen einige alternative Programmiersprachen für die JVM Javas Position in der Android-Welt anzugreifen. Hier kommt Kotlin ins Spiel.

Mit seiner 2016 veröffentlichten Programmiersprache Kotlin schickt JetBrains einen eigenen Konkurrenten ins Rennen. Kotlin will durch eine niedrige Lernkurve, leichte Integration durch starke Interoperabilität mit Java und nicht zuletzt nützliche Sprachfeatures punkten. Dabei versucht Kotlin nicht, alles anders als Java zu machen, sondern setzt auf dessen Stärken auf. Gleichzeitig wird ein Fokus auf die Behebung von bekannten Schwächen gesetzt. Zusammenfassen lässt sich dieser Kurs unter dem Begriff Pragmatismus, den JetBrains selbst in der Beschreibung seines Produkts benutzt. Zusätzlich wurde ein besonderer Fokus auf die Unterstützung von Android gelegt, was die Android-Community der Sprache mit einer rasanten Adaption dankt. In diesem Artikel werden wir sehen, was Kotlin für Android-Entwickler so attraktiv macht, wie es die Entwicklung beschleunigen und vereinfachen will und wie es sich in das reichhaltige Android-Ökosystem einfügt. JetBrains ist Android-Entwicklern spätestens seit der Veröffentlichung der Standardentwicklungsumgebung Android Studio ein Begriff. Deren IDE-Plattform IntelliJ bildet die Grundlage für Android Studio. JetBrains, das sein Geld mit der Entwicklung von Programmierwerkzeugen verdient, die hauptsächlich auf der JVM laufen, war 2010 mit Java als Programmiersprache nicht mehr zufrieden und sah sich nach Alternativen um. Als einziger aussichtsreicher Kandidat stand Scala da, wurde allerdings aufgrund der hohen Kompilierzeiten verworfen. Stattdessen wurde die Entscheidung getroffen, eine eigene Programmiersprache zu entwickeln. Sechs Jahre später, im Februar 2016, wurde sie als Kotlin in der Version 1.0 veröffentlicht. Da JetBrains über eine riesige Codebasis in Java verfügte, war eine zentrale Anforderung von Kotlin die Interoperabilität mit Java. Das bedeutet, Java- und Kotlin-Klassen können sich gegenseitig ohne Hürden aufrufen. Das ermöglicht es, vorhandenen Code in Java belassen zu können und nur bei Wunsch zu konvertieren, während neuer Code in Kotlin geschrieben werden kann. Als Hersteller von IDEs wurde ebenfalls ein hoher Fokus auf die Toolunterstützung von Kotlin gelegt. Das hat zur Folge, dass Android Studio eine vollwertige Kotlin-IDE ist.

Kotlin steht unter der Open-Source-Lizenz Apache 2.0, die Entwicklung findet auf GitHub statt und wird sowohl von JetBrains als auch von freiwilligen Communitymitgliedern in Form von Pull Requests durchgeführt. Im offiziellen Slack [1] tauschen sich über fünftausend Mitglieder aus. Zum jetzigen Zeitpunkt (Dezember 2016) steht die Version 1.0.5 bereit, während die nächste Version 1.0.6 von Interessierten als Early Access Preview (EAP) getestet werden kann. Während die 1.0.X-Releases sich auf verbesserte IDE-Unterstützung und Fehlerbehebungen fokussieren, wird parallel an der Version 1.1 gearbeitet, die neue Sprachfeatures bieten soll und ebenfalls als EAP verfügbar ist. Fehlerberichte werden im Bugtracker unter [2] akzeptiert, während Änderungen an der Sprache im so genannten Kotlin Evolution and Enhancement Process (KEEP) diskutiert werden [3].

Features von Kotlin

Kotlin wirbt mit einer zugleich ausdrucksstarken und lesbaren Syntax, die Java-Entwickler innerhalb weniger Stunden fließend lesen und schreiben können. Im Gegensatz zu vielen Curly-Brace-Sprachen wie Java, stehen bei der statisch typisierten Sprache Kotlin die Typen nicht vor, sondern hinter den Deklarationen. Eine Variable wird z. B. folgendermaßen deklariert: val s: String = "Hello". In den meisten Fällen ist die explizite Typangabe aber überflüssig, da der Typ aus dem Kontext inferiert werden kann. In unserem Beispiel bleibt somit nur val s = "Hello" übrig. Das gilt nicht nur für Variablen, sondern auch für Funktionen, die wie folgt deklariert werden: fun sayHello(s: String) = "Hello, $s". Besteht die Funktion aus mehr als einem Ausdruck, ersetzen wir das Gleichheitszeichen durch geschwungene Klammern. In diesem Fall ist die Typangabe Pflicht, und ein Wert wird mit dem Keyword return zurückgegeben:

fun sayHello(s: String): String { val hello = "Hello, $s" return hello }

Hier haben wir soeben zwei weitere Features von Kotlin gesehen: Semikolons und Stringinterpolation. Semikolons sind optional – und verpönt. Bei der Stringinterpolation können beliebige Ausdrücke direkt in einen String eingebettet werden, indem ihnen $ vorangestellt wird. Eine Klasse wird in Kotlin wie folgt deklariert:

class Greeter(val name: String = "Kotlin") { fun greet() = "Hello, $name" }

In diesem Codeschnipsel sehen wir einen Primary Constructor, der sich direkt hinter dem Klassennamen befindet. Parameter, denen das val-Keyword vorausgeht, werden zugleich zu einer Property, der der entsprechende Wert zugewiesen wird. Das ist im Wesentlichen syntaktischer Zucker für ein Feld mit einem Getter – und optional einem Setter, dann lautet das Keyword var. Jeder Java-Entwickler hat sicherlich unzählige solcher Feld-Konstruktor-Getter-Triple geschrieben oder im besten Fall von einer IDE erzeugen lassen. Teil der Kotlin-Philosophie ist es, solche Best Practices zu erleichtern, indem sie als Sprachkonstrukte zur Verfügung gestellt werden. Der Parameter name hat weiterhin einen Defaultwert, weswegen er beim Aufruf weggelassen werden kann. In Java wird so etwas typischerweise durch Überladungen erzielt. Das Instanziieren von Klassen funktioniert wie in Java, lediglich das Keyword new fällt komplett weg. Wer in seiner Klasse zusätzlich equals(), hashCode() und toString() benötigt, versieht diese mit dem Modifier data und bekommt diese ebenfalls vom Compiler erzeugt.

data class Person(val name: String, val age: Int)

Die geschwungenen Klammern fallen weg, wenn die Klasse keine Member hat. Unser Einzeiler ist jetzt ein geeigneter Schlüssel mit zwei Komponenten für eine HashMap.

Methoden müssen nicht unbedingt ...

Neugierig geworden? Wir haben diese Angebote für dich:

Angebote für Gewinner-Teams

Wir bieten Lizenz-Lösungen für Teams jeder Größe: Finden Sie heraus, welche Lösung am besten zu Ihnen passt.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang