Keine Lust mehr auf Java? Dann wechsle jetzt zu Kotlin!
Kotlin gehört zu den beliebtesten Programmiersprachen und das aus guten Gründen. Wenn du dich noch mit Java oder Javascript herumschlägst, solltest du dir Kotlin anschauen. Warum? Das zeigen dir die folgenden Syntax-Vergleiche. Du erfährst nicht nur, was Kotlin besser macht, sondern steigst auch leichter in die Jetbrains-Sprache ein.
Passend dazu und was Javascript damit zu tun hat: Deswegen ist Kotlin so unfassbar beliebt
Grundlegende Syntax
Bevor wir uns komplexere Beispiele angucken, werfen wir den ersten Blick auf die grundlegende Syntax. Im Beispiel-Code fällt bereits im Kleinen auf, dass Kotlin meistens mit weniger auskommt als äquivalenter Java-Code. Zum Beispiel ist das Semikolon optional – kann aber auch hingeschrieben werden, falls man sich daran gewöhnt hat. Okay, ein Zeichen verkürzt den Code nicht entscheidend. Deswegen schauen wir uns ein paar weitere Code-Schnipsel an. Hier wurden bewusst einige Besonderheiten eingebaut, damit ihr bereits einige Kniffe der Sprache lernt.
Funktionen erstellen
Starten wir mit der Definition einer neuen Funktion mit und ohne Rückgabewert. Die Sichtbarkeit public
ist bei Kotlin ein Standard-Wert und muss nicht explizit hingeschrieben werden.
Java
// Mit Rückgabewert
public int abs(int a) {
if(a < 0) return -a;
return a;
}
// Ohne Rückgabewert
private void printWithPrefix(String text) {
System.out.println("Output: " + text);
}
Kotlin
// Mit Rückgabewert
fun abs(a: Int): Int {
if(a < 0) return -a
return a
}
// Oder äquivalent und kürzer
fun abs(a: Int) = if (a < 0) -a else a
// Ohne Rückgabewert
private fun printWithPrefix(text: String) {
println("Output: $text")
}
Variablendefinition
Bei der Definition einer neuen Variable muss ein var
vor den Namen gesetzt werden, wenn sie veränderbar sein soll. Das Gegenstück ist val
.
Java
// Beispiel 1
public int a = 0;
// Beispiel 2
private int a = 0;
// Beispiel 3
final public int a = 0;
// Beispiel 4
public int a;
Kotlin
// Beispiel 1 (Typ ist bei Bsp. 1-3 optional)
var a: Int = 0
var a = 0
// Beispiel 2
private var a: Int = 0
// Beispiel 3
val a: Int = 0
// Beispiel 4 (Hier muss der Typ angegeben werden)
var a: Int
Strings verketten
Bei dem oberen Beispiel der Funktion printWithPrefix
wird deutlich, dass Strings mit Variablen in Kotlin deutlich leichter verknüpft werden können: Benötigt wird lediglich das Dollar-Zeichen. Kombinieren wir das jedoch mit geschweiften Klammern, können sogar ganze Funktionsaufrufe in einem String eingesetzt werden.
var age = 29
var s = "Ich bin $age Jahre alt"
println("${s.replace("bin", "war")}, bin jetzt aber ${++age} geworden.")
// Ausgabe: Ich war 29 Jahre alt, bin jetzt aber 30 geworden.
Kotlin macht Schluss mit Null-Pointer-Exceptions
In Java ist folgender Code ohne Compiler-Fehler möglich:
public String s = null;
System.out.println(s.length());
Doch beim Ausführen dieses Java-Programms gibt es natürlich die allseits gehasste Null-Pointer-Exception. Vor allem bei komplexeren Java-Programmen ist das ein echtes Problem. Solche Fehler treten dann alles andere als selten auf. Wenn der Entwickler nicht jeden Fall bedacht hat, wann eine Variable vielleicht doch eine Null-Referenz besitzen kann, dann werden solche Exceptions immer wieder auftreten. Kotlin löst das Problem ganz einfach: Variablen dürfen ohne weiteres keine Null-Referenz haben – außer ihr fügt ein Fragezeichen an.
var s: String = null // Compiler-Fehler
var sNull: String? = null // Ok
println(sNull.length) // Compiler-Fehler: sNull könnte Null sein
Bedeutet: Unter Kotlin können erstmal keine Null-Pointer-Exceptions mehr zur Laufzeit auftreten – außer ihr lasst sie explizit zu. Doch wie könnt ihr nun auf Null-Variablen zugreifen? Wir definieren uns folgende Variablen:
var s0: String? = null
var s1: String? = "Doch nicht null"
Dann kann wie folgt drauf zugegriffen werden:
// Möglichkeit 1
var s0Length: String? = null;
if(s0 != null) s0Length = s0.length
// Möglichkeit 2
// s1Length ist Null, wenn s1 == null, sonst wird hinterer Teil ausgeführt
var s1Length = s1?.length
// Das lässt sich beliebig lang fortsetzen
var example = s1?.elementAtOrNull(10)?.dec()
// Möglichkeit 3
var s0Length = s0!!.length // Wirft NullPointerException, wenn s0 == null
Ein kleiner Ausblick auf Lambda-Funktionen: Angenommen eine Funktion, die auf einer Variablen v aufgerufen wird, die auch Null sein kann, liefert ein Ergebnis zurück. Mit dem Ergebnis wollt ihr nun weiter arbeiten, vorausgesetzt v ist nicht Null. Dann hilft euch Kotlin mit let
:
Java
public String s = "";
if(s != null) {
if(s.isEmpty()) {
System.out.println("String s ist nicht null aber leer.");
}
}
Kotlin
var s: String? = ""
s?.let{ if(it.isEmpty()) println("String s ist nicht null aber leer.") }
Das Keyword „it“ ist nichts anderes als die Variable s, die let
an den Scope zwischen den geschweiften Klammern weitergibt. Jedoch wird der Scope nur ausgeführt, wenn s nicht Null ist. Der Einsatz dieser Funktion wirkt hier zwar noch banal, in der Realität ist sie jedoch unfassbar nützlich und spart immer wieder Code ein.
Typecasting in schön
Typecasting – in Java ist das häufig mit redundantem Code verbunden. Erst muss der Variablen-Type geprüft werden, dann muss die Variable nochmal extra gecastet werden. In Kotlin ist letzteres nicht notwendig.
Java
public int getStringLength(Object obj) {
if(obj instanceof String){
// obj muss explizit zum String gecastet werden!
return ((String) obj).length();
}
return null;
}
Kotlin
fun getStringLength(obj: Any): Int? {
if (obj is String) {
// obj wird automatisch zum String
return obj.length
}
return null
}
In den folgenden Fällen wird „obj“ auch automatisch zum String:
fun getStringLength(obj: Any): Int? {
if (obj !is String) return null
return obj.length
}
// Oder auch hier auf der rechten Seite der if-Anweisung
fun getStringLength(obj: Any): Int? {
if (obj is String && !obj.isEmpty())
return obj.length
return null
}
Behalte die Kontrolle: Mit „when“ statt „switch“
Das Switch-Case-Konstrukt gibt es in Kotlin nicht. Ersetzt wird es durch die innovative When-Verschachtelung.
val x = 2
when (x) {
1 -> println("x == 1")
Integer.parseInt("2") -> println("x == 2")
in 3..5 -> println("x liegt zwischen 3 und 5")
else -> {
println("x ist etwas anderes")
}
}
// Oder ihr nutzt when statt if
val s = "t3n"
when {
s.contains("n") -> println("$s contains n")
x == 3 -> println("$s hat kein n, x ist aber 3")
else -> println("Irgendwas anderes")
}
Daten-Klassen sparen jede Menge Code ein
Keine Lust, den immer wieder gleichen Code zu schreiben? Dann kannst du sogenannte Daten-Klassen verwenden. Dort werden die folgenden Funktionen automatisch vom Compiler erstellt:
equals()
hashCode()
toString()
in der Form"Company(name=t3n, location=Hanover, hasWebsite=true)"
- Setter und Getter
copy()
Das sorgt für einen immens reduzierten Code im Vergleich zu Java.
Java
public class Company {
private String name;
private String location;
private boolean hasWebsite;
public String getName(){
return this.name;
}
public void setName(String name){
this.name = name;
}
/* Und die anderen Setter und Getter ... */
@Override
public boolean equals(Object obj){
if(obj == null || getClass() != obj.getClass())
return false;
if(this == obj)
return true;
Car other = (Car) obj;
/* Vergleiche jede einzelne Eigenschaft miteinander */
}
@Override
public String toString() { /* ...... */ }
}
Kotlin
Mehr als diese eine Zeile Code ist dafür nicht nötig:
data class Company(private var name: String, private var location: String, private var hasWebsite: Boolean)
Weitere Beispiele, die Kotlin extrem einfach machen
Wie innovativ und leicht lesbar Kotlin-Code an vielen weiteren Stellen ist, zeigen die weiteren Beispiele.
// Filtern einer Liste
val a = list.filter{ it > 0 }
// Auf Maps zugreifen (ohne 'mutable' ist Map nicht veränderbar)
val map = mutableMapOf("x" to 1, "y" to 2, "z" to 3)
map["y"] = 5
print(map["y"]) // gibt 5 aus
// Über ganze Map iterieren
for((key, value) in map) {
println("$key -> $value")
}
// Nützlicher Einsatz von Ranges
for (i in 1..10){} // Schleife läuft von i=1 bis i=10
for (i in 1 until 10){} // Schleife läuft von i=1 bis i=9
for (i in 1..10 step 2){}
for (i in 10 downTo 1){}
// Erstell eine Liste
val list = listOf(1, 2, 3) // nicht veränderbar
val mutableList = mutableListOf(1, 2, 3) // veränderbar
mutableList += listOf(4, 5) // mutableList = [1, 2, 3, 4 , 5]
// Erweitere beliebige Klassen mit neuen Funktionen
fun String.removeLastChar(): String = this.substring(0, this.length - 1)
Das war so ziemlich die wichtigste Syntax von Kotlin. Doch nur durchlesen reicht nicht – probier es selbst aus. Wenn du von Java kommst, schnapp dir ein kleines Java-Projekt oder ein paar Klassen und schreib sie einfach mal in Kotlin um.
Was du noch über Kotlin wissen solltest:
- Kotlin wird offiziell von Android unterstützt
- Bessere Kotlin-Unterstützung und Java 8 mit Android Studio 3.0
„Du hast genug von Java und Javascript?“ Ernsthaft? Danach soll man diesen Artikel noch ernst nehmen?
Hallo,
die Überschrift hängt damit zusammen, dass Jetbrains genau aus diesem Zweck Kotlin entwickelt hat. Weil sie eben ein besseres Java entwickeln wollten.
Außerdem ist Kotlin laut der diesjährigen Stackoverflow-Umfrage die zweitbeliebteste Programmiersprache, während Java jeder zweite (der mit Java gearbeitet hat) diese auch weiter verwenden möchte.
Außerdem ist Java-Code mit Kotlin-Code kompatibel (in Kotlin können Java-Klassen verwenden werden und umgekehrt). Da kann man doch die Überschrift und den Teaser mal ein bisschen aufpeppen, findest du nicht? Muss ja nicht immer alles so kling wie überall sonst ;)
Liebe Grüße aus Hannover
Andreas
Wie Aussagekräftig sind solche Umfragen?
Ich programmier jetzt seit über 15 Jahren mit/in PHP, Javascript und C# und höre „Kotlin“ grad zum ersten mal.
Hab wohl zu wenig mit Java zutun? :)
Für (Ex)Java-Entwickler sicher interessant, mich persönlich überzeugt die Syntax und Struktur jetzt nicht. Und eine Sprache wie Java oder Kotlin zu nutzen um Javascript zu generieren ist für mich auch irgendwie „von hinten durch die Brust ins Auge“, zumindest im Web-Context. Das geht theoretisch auch mit C++ und anderen aber viel Spaß beim Debuggen ;)
Grüße
Hallo Michael,
Kotlin ist tatsächlich am sinnvollsten als Java-Ersatz bzw. vor allem wenn du für Android Apps entwickelst.
Kotlin ist auch eine sehr junge Sprache, kann also vorkommen, dass wenn man nicht bei Java oder Android unterwegs ist, die Sprache noch nicht kennt.
Wie gut Kotlin für Javascript ist, kann ich nicht aus eigener Erfahrung sagen. Für Android und Java ist Kotlin, wie ich finde, die deutlich bessere Alternative :)
Viele Grüße aus Hannover,
Andreas
Zitat: „Du hast genug von Java und Javascript? Dann mach Schluss und wechsle zur beliebten Programmiersprache Kotlin.“
Ich habe ja Verständnis für einen reißerische Artikelanfang, aber bleibt doch bitte professionell und erhaltet das hohe Niveau.
Hallo,
die Überschrift hängt damit zusammen, dass Jetbrains genau aus diesem Zweck Kotlin entwickelt hat. Weil sie eben ein besseres Java entwickeln wollten.
Außerdem ist Kotlin laut der diesjährigen Stackoverflow-Umfrage die zweitbeliebteste Programmiersprache, während Java jeder zweite (der mit Java gearbeitet hat) diese auch weiter verwenden möchte.
Außerdem ist Java-Code mit Kotlin-Code kompatibel (in Kotlin können Java-Klassen verwenden werden und umgekehrt). Da kann man doch die Überschrift und den Teaser mal ein bisschen aufpeppen, findest du nicht? Muss ja nicht immer alles so kling wie überall sonst ;)
Liebe Grüße aus Hannover
Andreas
„Muss ja nicht immer alles so kling wie überall sonst ;)“
Nein, muss es natürlich nicht. Es sollte nur professionell klingen … Dann nimmt man den Artikel – über eine sehr gute Sprache – auch ernster.
viele Grüße aus München
Tolga
Ich habe die Formulierung mal ein wenig angepasst ;)
Liebe Grüße und einen sonnigen Dienstag
Andreas
Haha.. what the fuck.. „Du hast genug von Java und Javascript? Dann mach Schluss und wechsle zur beliebten Programmiersprache Kotlin. Wir vergleichen die beiden Sprachen miteinander. „
Hallo,
die Überschrift hängt damit zusammen, dass Jetbrains genau aus diesem Zweck Kotlin entwickelt hat. Weil sie eben ein besseres Java entwickeln wollten.
Außerdem ist Kotlin laut der diesjährigen Stackoverflow-Umfrage die zweitbeliebteste Programmiersprache, während Java jeder zweite (der mit Java gearbeitet hat) diese auch weiter verwenden möchte.
Außerdem ist Java-Code mit Kotlin-Code kompatibel (in Kotlin können Java-Klassen verwenden werden und umgekehrt). Da kann man doch die Überschrift und den Teaser mal ein bisschen aufpeppen, findest du nicht? Muss ja nicht immer alles so kling wie überall sonst ;)
Liebe Grüße aus Hannover
Andreas
Was hat Java mit Javascript zu tun :-)
Hallo Patrick,
erstmal natürlich gar nichts. Kotlin kann jedoch unter anderem dazu verwendet werden, Code für Java oder Javascript zu schreiben. Der Compiler übersetzt dann den Code entweder für die JVM oder generiert JS-Code.
Details zu den Einsatzmöglichkeiten von Kotlin habe ich auch am Anfang des Artikels verlinkt: https://t3n.de/news/kotlin-programmiersprache-1094268/
Vgl: https://kotlinlang.org/docs/reference/js-overview.html bzw. https://kotlinlang.org/docs/reference/server-overview.html
Ich glaube meinen Vorrednern ging es auch darum, darauf hinzuweisen das Java und JavaScript rein Garnichts miteinander zu tun haben, außer vielleicht einen ähnlich klingenden Namen.
Java ist eine statisch typisierte Sprache welche in Zwischencode compiliert und von der JVM interpertiert wird. Javascript ist eine dynamisch typisierte Skriptsprache welche zur Laufzeit durch eine Browser-Engine interpretiert wird. Man kann JavaScript auch auf der JVM laufen lassen(Stichwort Rhino, Nashorn oder GraalVM) aber das ist nicht das standard Einsatzgebiet von JavaScript.
Wenn man Javascript in diesem Kontext erwähnt, dann hätte man die Möglichkeit nennen können Kotlin Code in JavaScript zu transpilieren.
https://kotlinlang.org/docs/tutorials/javascript/kotlin-to-javascript/kotlin-to-javascript.html
Als Scala Entwickler muss ich natürlich auch noch darauf hinweisen, dass Scala das auch alles kann.
http://www.lihaoyi.com/hands-on-scala-js/
Hallo Christian,
ziemlich sicher ging es meinen Vorrednern nicht darum, sondern um die Formulierung (die ich inzwischen angepasst habe). Schön das du nochmal die Unterschiede von Java und Javascript nennst, darum geht es hier aber gar nicht. Selbstverständlich haben beide Sprachen nichts miteinander zu tun. Kotlin kann jedoch u.a. für Javascript und Java geschrieben werden. Deswegen habe ich beide genannt.
Ziemlich weit oben im Text ist auch der erste Artikel zum Thema Kotlin sehr präsent verlinkt. Dort habe ich das bereits einige Zeit vorher ziemlich genau erklärt ;)
Zu deinem Vergleich mit Scala: Es ist gut, dass Scala das kann, jedoch scheint die Sprache nicht so beliebt zu sein, wie Kotlin. (vgl. https://insights.stackoverflow.com/survey/2018). Davon abgesehen geht es in diesem Artikel ja nicht darum, irgendwelche alternative Java oder JS-Sprachen aufzuzählen, sondern einen Einstieg in die sehr junge und vor allem beliebte Sprache Kotlin zu geben ;)
Viele Grüße aus Hannover
Andreas
Hallo Andreas ,
ich habe meinen Kommentar geschrieben, da nur in der Überschrift das Wort Javascript vorkam und im Text mit keiner Silbe darauf eingegangen wurde. Ich habe extra ein paar mal durch den Text gesucht, ob ich doch nicht irgendwo eine Erläuterung finde, wieso du in der Überschrift Java und Javascript in einem Atemzug verwendest und dann nur auf Kotlin als Alternative eingehst. Der von dir erwähnte Link war zum dem Zeitpunkt definitiv nicht vorhanden.
Es ist natürlich schwer, für den Leser deiner Artikel, zu verstehen was du dir bei diesem Thema gedacht hast. Wir als Leser können nur mit den Informationen in deinem Artikel arbeiten. Und für mich sah es anhand dieser Informationen danach aus, als ob du nur oberflächlich eine Ahnung von diesem Thema hast. Deshalb habe ich versucht nochmal die Unterscheide aufzuzeigen. Ich bin in meiner Arbeit als Softwareentwickler schon oft darüber gestolpert, das Anfänger die beiden Sprachen Java und Javascript gleich setzen. Deshalb bin ich auch davon ausgegangen, dass dir der Unterscheid nicht klar ist. Das nächste mal sollte ich einfach nochmal genauer nachfragen. Asche auf mein Haupt.
Ich kann dir nur ans Herz legen, deine Artikel vielleicht vor dem Absenden noch mal genau auf Stimmigkeit zu überprüfen. Ich glaube dann entstehen solche Diskussionen auch nicht.
Mal eine ernst gemeinte Frage und auch nicht provokativ gemeint. Gibt es bei euch in der Redaktion sowas wie einen Review Prozess ähnlich wie in der Softwareentwicklung? Oder kann jeder Redakteur selber entscheiden, wann ein Artikel reif für die Massen ist? Ich kenne mich da leider gar nicht aus.
Beste Grüße
Christian
Hallo Christian,
da hast du recht, dass ich noch zu Javascript 2, 3 Sätze hätte schreiben können. Der erwähnte Link war in der Form so bereits da. Ich habe lediglich „ und was Javascript damit zu tun hat“ ergänzt, um das klarer zu machen.
Und ich kann dich beruhigen: Wenn ich von einem Thema absolut keine Ahnung habe, informiere ich mich gründlich drüber oder schreibe erst gar keinen Artikel dazu :)
Als Informatikstudent der in das 5. Semester kommt wäre es jedoch ziemlich fatal, wenn ich nicht den Unterschied zwischen Java und Javascript kennen würde.
Und ja, es gibt einen Review-Prozess. Je nach Artikel wird sich aber vor allem auf die Ausdrucksweise, Rechtschreibung und Grammatik geachtet. Inhaltlich ist das manchmal nicht so leicht, da sich nicht jeder mit jedem Thema genau auskennt.
Viele Grüße
Andreas
„Java und Javascript sind nicht die beliebtesten Sprachen.“
… ernsthaft? Ohne JavaScript laufen derzeit fast keine Webseiten mehr! Wäre JS net so beliebt, wäre es wohl kaum so weit verbreitet oder?
Hallo,
ja ernsthaft. Nur weil eine Sprache viel benutzt wird, bedeutet das nicht automatisch, dass sie beliebt ist. Es bedeutet in diesem Fall einfach, dass sie in diesem Bereich einfach bislang die beste Wahl ist. Auch wenn laut der aktuellen Stackoverflow-Umfrage Javascript noch ein gutes Stück über Java liegt, so ist Kotlin noch deutlich beliebter.
Schau doch mal gerne rein: https://insights.stackoverflow.com/survey/2018
Viele Grüße
Andreas
Wer Javascript und Java in einem Atemzug nennt, outed sich nicht gerade als Voll-Profi. Damit ist der ganze Artikel obsolet.
Hallo Jürgen,
wer nicht in der Lage ist, den gesamten Artikel zu lesen bevor er hier ein Kommentar hinterlässt, ist auch nicht gerade hilfreich. Aber ich erkläre dir das gerne auch nochmal, was schon mindestens drei mal hier in den anderen Kommentaren steht.
Richtig, Java und Javascript haben nichts miteinander zu tun. Bedeutet nicht, dass man sie nicht in einem Atemzug nennen darf! Ganz weit oben im Artikel, ziemlich präsent ist auch ein von mir vor kurzer Zeit erschienener Artikel verlinkt, in der ich ziemlich genau erkläre, wofür Kotlin verwendet werden kann: nämlich entweder für Java (wird in Bytecode für die JVM übersetzt) oder Kotlin kann auch für Javascript genutzt werden, dann wird eben Javascript Code generiert.
Java und Javascript können ohne Problemen in einem Atemzug genannt werden, es kommt nur auf den Kontext an.
Grüße
Andreas