Was ist Kotlin? Die Java-Alternative erklärt

Kotlin ist eine allgemeine, kostenlose Open-Source-Programmiersprache mit statischer Typisierung und „pragmatischer“ Programmiersprache, die ursprünglich für JVM (Java Virtual Machine) und Android entwickelt wurde und objektorientierte und funktionale Programmierfunktionen kombiniert. Es konzentriert sich auf Interoperabilität, Sicherheit, Klarheit und Werkzeugunterstützung. Versionen von Kotlin, die auf JavaScript ES5.1 und nativen Code (unter Verwendung von LLVM) für eine Reihe von Prozessoren abzielen, sind ebenfalls in Produktion.

Kotlin entstand 2010 bei JetBrains, dem Unternehmen hinter IntelliJ IDEA, und ist seit 2012 Open Source. Das Kotlin-Team hat derzeit mehr als 90 Vollzeitmitglieder von JetBrains, und das Kotlin-Projekt auf GitHub hat mehr als 300 Mitarbeiter. JetBrains verwendet Kotlin in vielen seiner Produkte, einschließlich seines Flaggschiffs IntelliJ IDEA.

Kotlin als prägnantere Java-Sprache

Auf den ersten Blick sieht Kotlin wie eine präzisere und optimierte Version von Java aus. Betrachten Sie den obigen Screenshot, in dem ich ein Java-Codebeispiel (links) automatisch in Kotlin konvertiert habe. Beachten Sie, dass die sinnlose Wiederholung, die mit der Instanziierung von Java-Variablen verbunden ist, verschwunden ist. Die Java-Sprache

StringBuilder sb = new StringBuilder ();

Wird in Kotlin

val sb = StringBuilder ()

Sie können sehen, dass Funktionen mit dem funSchlüsselwort definiert sind und dass Semikolons jetzt optional sind, wenn Zeilenumbrüche vorhanden sind. Das valSchlüsselwort deklariert eine schreibgeschützte Eigenschaft oder eine lokale Variable. In ähnlicher Weise vardeklariert das Schlüsselwort eine veränderbare Eigenschaft oder eine lokale Variable.

Trotzdem ist Kotlin stark typisiert. Die Schlüsselwörter valund varkönnen nur verwendet werden, wenn der Typ abgeleitet werden kann. Andernfalls müssen Sie den Typ deklarieren. Die Typinferenz scheint sich mit jeder Veröffentlichung von Kotlin zu verbessern.

Schauen Sie sich die Funktionsdeklaration oben in beiden Fenstern an. Der Rückgabetyp in Java steht vor dem Prototyp, in Kotlin folgt er jedoch dem Prototyp, der wie in Pascal mit einem Doppelpunkt abgegrenzt ist.

Aus diesem Beispiel ist es nicht ganz offensichtlich, aber Kotlin hat Javas Anforderung gelockert, dass Funktionen Klassenmitglieder sein müssen. In Kotlin können Funktionen in einer Datei auf oberster Ebene lokal in anderen Funktionen, als Elementfunktion innerhalb einer Klasse oder eines Objekts und als Erweiterungsfunktion deklariert werden. Erweiterungsfunktionen bieten die C # -ähnliche Möglichkeit, eine Klasse mit neuen Funktionen zu erweitern, ohne von der Klasse erben oder ein beliebiges Entwurfsmuster wie Decorator verwenden zu müssen.

Für Groovy-Fans implementiert Kotlin Bauherren. Tatsächlich können Kotlin-Builder typgeprüft werden. Kotlin unterstützt delegierte Eigenschaften, mit denen Lazy-Eigenschaften, beobachtbare Eigenschaften, Veto-Eigenschaften und zugeordnete Eigenschaften implementiert werden können.

Viele in anderen Sprachen verfügbare asynchrone Mechanismen können mithilfe von Kotlin-Coroutinen als Bibliotheken implementiert werden. Dies beinhaltet async/ awaitvon C # und ECMAScript, Kanäle und Auswahl von Go und generators/ yieldvon C # und Python.

Funktionsprogrammierung in Kotlin

Das Zulassen von Funktionen der obersten Ebene ist nur der Anfang der funktionalen Programmiergeschichte für Kotlin. Die Sprache unterstützt auch Funktionen höherer Ordnung, anonyme Funktionen, Lambdas, Inline-Funktionen, Schließungen, Schwanzrekursion und Generika. Mit anderen Worten, Kotlin bietet alle Funktionen und Vorteile einer funktionalen Sprache. Betrachten Sie beispielsweise die folgenden funktionalen Kotlin-Redewendungen.

Filtern einer Liste in Kotlin

val positives = list.filter {x -> x> 0}

Verwenden Sie für einen noch kürzeren Ausdruck, itwenn die Lambda-Funktion nur einen einzigen Parameter enthält:

val positives = list.filter {it> 0}

Durchqueren einer Karte / Liste von Paaren in Kotlin

für ((k, v) in der Karte) {println ("$ k -> $ v")}

kund  v kann alles genannt werden.

Bereiche in Kotlin verwenden

für (i in  1..100) {...} // geschlossener Bereich: enthält 100

für (i in  1 bis 100) {...} // halboffener Bereich: enthält nicht 100

für (x in  2..10 Schritt 2) {...}

für (x in  10 downTo 1) {...}

if (x in  1..10) {...}

Die obigen Beispiele zeigen das  for Schlüsselwort sowie die Verwendung von Bereichen.

Obwohl Kotlin eine vollwertige funktionale Programmiersprache ist, behält es den größten Teil der objektorientierten Natur von Java als alternativen Programmierstil bei, was beim Konvertieren von vorhandenem Java-Code sehr praktisch ist. Kotlin hat Klassen mit Konstrukteuren, zusammen mit verschachtelten, inneren und anonymen inneren Klassen, und es verfügt über Schnittstellen wie Java 8. Kotlin hat nicht einen hat newSchlüsselwort. Um eine Klasseninstanz zu erstellen, rufen Sie den Konstruktor wie eine reguläre Funktion auf. Das haben wir im Screenshot oben gesehen.

Kotlin hat eine einzelne Vererbung von einer benannten Oberklasse, und alle Kotlin-Klassen haben eine Standard-Oberklasse Any, die nicht mit der Java-Basisklasse identisch ist java.lang.Object. Anyenthält nur drei vordefinierten Mitgliedsfunktionen: equals(), hashCode(), und toString().

Kotlin-Klassen müssen mit dem openSchlüsselwort markiert werden, damit andere Klassen von ihnen erben können. Java-Klassen sind genau umgekehrt, da sie vererbbar sind, sofern sie nicht mit dem finalSchlüsselwort gekennzeichnet sind. Um eine Oberklassenmethode zu überschreiben, muss die Methode selbst openund die Unterklassenmethode markiert sein override. Dies alles ist Teil von Kotlins Philosophie, Dinge explizit zu machen, anstatt sich auf Standardeinstellungen zu verlassen. In diesem speziellen Fall kann ich sehen, wo Kotlins Methode, Basisklassenmitglieder explizit als vererbbar und abgeleitete Klassenmitglieder als Überschreibungen zu markieren, verschiedene Arten von häufigen Java-Fehlern vermeidet.

Sicherheitsmerkmale in Kotlin

Kotlin wurde entwickelt, um häufige Fehler zu vermeiden und die Behandlung von Nullwerten zu optimieren. Dazu wird ein nullStandard für Standardtypen ungültig gemacht, nullfähige Typen hinzugefügt und Verknüpfungsnotationen implementiert, um Tests für null zu verarbeiten.

Beispielsweise kann eine reguläre Variable vom Typ  nicht enthalten  :String null

var a: String = "abc"

a = null // Kompilierungsfehler

Wenn Sie Nullen zulassen müssen, um beispielsweise SQL-Abfrageergebnisse zu speichern, können Sie einen nullbaren Typ deklarieren, indem Sie dem Typ ein Fragezeichen hinzufügen, z String?.

var  b: String?

b = null  // ok

Der Schutz geht etwas weiter. Sie können einen nicht nullbaren Typ ungestraft verwenden, müssen jedoch einen nullbaren Typ auf Nullwerte testen, bevor Sie ihn verwenden können.

Um die ausführliche Grammatik zu vermeiden, die normalerweise für Nulltests benötigt wird, führt Kotlin einen sicheren Aufruf ein , der geschrieben wurde ?.. Gibt beispielsweise zurück, wenn dies nicht der Fall ist , und andernfalls. Der Typ dieses Ausdrucks ist .b?.length b.lengthbnullnullInt?

Mit anderen Worten, b?.lengthist eine Abkürzung für if (b != null) b.length else null. Diese Syntax ist gut verkettet und eliminiert eine Menge Prolix-Logik, insbesondere wenn ein Objekt aus einer Reihe von Datenbankabfragen gefüllt wurde, von denen jede möglicherweise fehlgeschlagen ist. Zum Beispiel bob?.department?.head?.namewürde der Name des Abteilungsleiters von Bob zurückgegeben, wenn Bob, die Abteilung und der Abteilungsleiter alle nicht null sind.

Um eine bestimmte Operation nur für Werte ungleich Null auszuführen, können Sie den Operator für sichere Anrufe ?.zusammen mit  letfolgenden Elementen verwenden :

val listWithNulls: List = listOf ("A", null)

für (Element in listWithNulls) {

      item? .let {println (it)} // druckt A und ignoriert null}

Oft möchten Sie einen gültigen, aber speziellen Wert aus einem nullbaren Ausdruck zurückgeben, normalerweise, damit Sie ihn in einem nicht nullbaren Typ speichern können. Hierfür gibt es eine spezielle Syntax namens Elvis-Operator (ich mache dir nichts vor), die geschrieben wurde ?:.

val l = b? .Länge ?: -1

ist das Äquivalent von 

val l: Int = if (b! = null) b.length else -1

In der gleichen Ader geprüft, Kotlin auslässt Java Ausnahmen, die throwable Bedingungen, die müssen gefangen werden. Zum Beispiel die JDK-Signatur

Appendable Append (CharSequence csq)  löst eine IOException aus.

erfordert, dass Sie IOExceptionjedes Mal abfangen, wenn Sie eine appendMethode aufrufen :

Versuchen {

  log.append (Nachricht)

}}

catch (IOException e) {

  // Mach etwas mit der Ausnahme

}}

Die Designer von Java hielten dies für eine gute Idee und für Nettoprogramme für Spielzeugprogramme, solange die Programmierer etwas Sinnvolles in die catchKlausel implementierten . In großen Java-Programmen sehen Sie jedoch allzu oft Code, in dem die obligatorische catchKlausel nur einen Kommentar enthält : //todo: handle this. Dies hilft niemandem und überprüfte Ausnahmen erwiesen sich als Nettoverlust für große Programme.

Kotlin Coroutinen

Coroutinen in Kotlin sind im Wesentlichen leichte Fäden. Sie starten sie mit dem launchCoroutine Builder im Kontext einiger CoroutineScope. Einer der nützlichsten Coroutine-Bereiche ist der runBlocking{}, der für den Bereich seines Codeblocks gilt.

kotlinx.coroutines importieren. *

fun main () = runBlocking {// this: CoroutineScope

    start {// starte eine neue Coroutine im Rahmen von runBlocking

        Verzögerung (1000L) // Nicht blockierende Verzögerung für 1 Sekunde

        println ("Welt!")

    }}

    println ("Hallo")

}}

Dieser Code erzeugt die folgende Ausgabe mit einer Verzögerung von einer Sekunde zwischen den Zeilen:

Hallo,

Welt!

Kotlin für Android

Bis Mai 2017 waren Java und C ++ die einzigen offiziell unterstützten Programmiersprachen für Android. Google hat auf der Google I / O 2017 die offizielle Unterstützung für Kotlin für Android angekündigt. Ab Android Studio 3.0 ist Kotlin in das Android-Entwicklungstoolset integriert. Kotlin kann mit einem Plug-In zu früheren Versionen von Android Studio hinzugefügt werden.

Kotlin kompiliert mit demselben Bytecode wie Java, arbeitet auf natürliche Weise mit Java-Klassen zusammen und teilt seine Tools mit Java. Da zwischen Kotlin und Java kein Overhead für das Hin- und Heranrufen anfällt, ist das schrittweise Hinzufügen von Kotlin zu einer Android-App in Java absolut sinnvoll. Die wenigen Fälle, in denen die Interoperabilität zwischen Kotlin und Java-Code nicht ausreichend ist, wie z. B. Nur-Java-Set-Eigenschaften, sind selten anzutreffen und können leicht behoben werden.

Pinterest war das Aushängeschild für Android-Apps, die bereits im November 2016 in Kotlin geschrieben wurden, und wurde im Rahmen der Kotlin-Ankündigung bei Google I / O 2017 prominent erwähnt. Darüber hinaus zitiert das Kotlin-Team gerne die Apps Evernote, Trello, Square und Coursera für Android.

Kotlin gegen Java

Die Frage, ob Kotlin oder Java für die Neuentwicklung ausgewählt werden soll, ist in der Android-Community seit der Ankündigung von Google I / O häufig aufgetaucht, obwohl die Frage bereits im Februar 2016 gestellt wurde, als Kotlin 1.0 ausgeliefert wurde. Die kurze Antwort lautet, dass Kotlin-Code sicherer und prägnanter als Java-Code ist und dass Kotlin- und Java-Dateien in Android-Apps koexistieren können, sodass Kotlin nicht nur für neue Apps nützlich ist, sondern auch zum Erweitern vorhandener Java-Apps.

Das einzige schlüssige Argument, das ich für die Wahl von Java gegenüber Kotlin gesehen habe, wäre für den Fall vollständiger Neulinge in der Android-Entwicklung. Für sie besteht möglicherweise ein Hindernis für die Überwindung, da sich die meisten Android-Dokumentationen und -Beispiele in der Vergangenheit in Java befinden. Andererseits ist das Konvertieren von Java in Kotlin in Android Studio eine einfache Angelegenheit, den Java-Code in eine Kotlin-Datei einzufügen.

Für fast alle anderen, die Android-Entwicklung betreiben, sind die Vorteile von Kotlin überzeugend. Die typische Zeit, die ein Java-Entwickler benötigt, um Kotlin zu lernen, beträgt einige Stunden - ein geringer Preis, um Nullreferenzfehler zu beseitigen, Erweiterungsfunktionen zu aktivieren, funktionale Programmierung zu unterstützen und Coroutinen hinzuzufügen. Die typische grobe Schätzung zeigt, dass die Anzahl der Codezeilen von Java nach Kotlin um etwa 40 Prozent gesunken ist.