Stand: 2017-03-25
Java-Kotlin-Spickzettel
Java und Kotlin mit Code-Beispielen im direkten Vergleich nebeneinander
Inhalt
Anwendung definieren
| Java | Kotlin |
|---|---|
|
|
In Kotlin können Funktionen direkt auf Paketebene, also außerhalb einer Klasse oder eines Objekts,
definiert werden. Deshalb ist für die main-Methode auch keine nutzlose Klasse erforderlich.
Text ausgeben
| Java | Kotlin |
|---|---|
|
|
Variablen und Werte definieren
| Java | Kotlin |
|---|---|
|
|
|
|
- In Kotlin steht der Typ mit einem Doppelpunkt getrennt hinter dem Variablennamen.
- Die Typangabe ist in Kotlin optional, wenn der Compiler ihn bestimmen kann.
- Variablen sind in Kotlin immer statisch typisiert, auch wenn der Typ nicht explizit angegeben wird; der Compiler leitet den Typ dann selbst ab.
varsteht für (veränderliche) Variablenvalsteht für unveränderliche Werte (Value)
Variablen in Strings
| Java | Kotlin |
|---|---|
|
|
In Kotlin können Variablen mit vorangestelltem $ direkt in Strings eingebettet werden; komplexe Ausdrücke wie b.x benötigen zusätzlich geschweifte Klammern.
Dokumentation: String Templates
Collections
| Java | Kotlin |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- In Kotlin werden Collections mit Factory-Methoden, die nach dem Schema
xxxOfbenannt sind, erzeugt. - Der Zugriff auf einzelne Elemente erfolgt mit
myCollection[index]bzw.myMap[schlüssel]. - In Java müssen zunächst veränderliche Collections erzeugt werden, die dann mit
Collections.unmodifiable...verpackt werden. Mit Kotlin kann man dagegen direkt unveränderliche Collections (listOf,setOf…) anlegen.
Dokumentation: Collections
Streams
| Java | Kotlin |
|---|---|
|
|
|
|
|
|
- Im Gegensatz zu Java, muss man in Kotlin eine Collection nicht erst mit der
stream()-Methode umwandeln. - In Kotlin braucht man keine
collect-Methode. itist in Kotlin der Standardname eines einzelnen Parameters eines Lambdaausdrucks.
Weitere Beispiele bei Stackoverflow.com
Bedingungen mit if
| Java | Kotlin |
|---|---|
|
|
|
|
ifist in Kotlin ein Ausdruck und hat somit einen Wert. Der Bedingungsoperator?:wird deshalb nicht benötigt.
Dokumentation: if
for-Schleife
| Java | Kotlin |
|---|---|
|
|
|
|
|
|
- Statt Doppelpunkt wird in Kotlin
ingeschrieben und die Typangabe ist optional. - Wenn Array-Elemente mit einem Index durchlaufen werden sollen, steht in Kotlin die Eigenschaft
indicesdes Arrays zur Verfügung. Der Compiler macht daraus eine optimale Implementierung die keine weiteren Objekte erzeugt. 1..10ist ein “Range” von 1 bis einschließlich 10.- Eine klassische
for-Schleife gibt es in Kotlin nicht.
Dokumentation: for
Schlüssel-Wert-Paare einer Map durchlaufen
| Java | Kotlin |
|---|---|
|
|
Durch sogenannte “desctructuring declarations”, kann in Kotlin ein Map-Eintrag in Schlüssel und Wert zerlegt werden.
switch und when
| Java | Kotlin |
|---|---|
|
|
- Kotlins
whenist Javasswitchähnlich. - Es gibt bei
whenkeinen “Durchfall” und deshalb auch kann man auch nie wieder einbreakvergessen. - Bei
whenkönnen mehrere Fälle mit Komma getrennt aufgeführt werden. defaultin Java entsprichtelsein Kotlin.- Im Gegensatz zu
switchhatwheneinen Wert und kann direkt einer Variablen zugewiesen werden. whenkann noch einiges mehr alsswitch:- Prüfung, ob ein Wert in einem Bereich liegt:
in 1..10 -> ... - Prüfung, ob ein Wert in einer Collection ist:
in myCollection -> ... - Typprüfung:
is Widget -> ...
- Prüfung, ob ein Wert in einem Bereich liegt:
Dokumentation: when
Gleichheit
| Java | Kotlin |
|---|---|
|
|
|
|
- Strukturgleicheit wird in Kotlin mit
==geprüft, was der Compiler in einenequals-Aufruf übersetzt. - Referenzgleichheit wird in Kotlin mit
===und Referenzungleichheit mit!==geprüft.
Dokumentation: Equality
Methoden und Funktionen
| Java | Kotlin |
|---|---|
|
|
|
|
|
|
- Funktionen mit nur einem Ausdruck können mit
=direkt hinter die Parameterliste geschrieben werden und benötigen keinreturn. - In Kotlin sind Methodenparameter implizit
final. voidals Spezialfall für “kein Rückgabewert” gibt es in Kotlin nicht, stattdessen gibt es das ObjektUnit.- Parameterlisten mit variabler Länge werden in Java mit
...und in Kotlin mit dem Schlüsselwortvararggeschrieben.
Dokumentation: Functions
Lambdaausdrücke
| Java | Kotlin |
|---|---|
|
|
|
|
|
|
|
|
|
|
- Spezielle Funktionstypen für primitive Datentypen wie Integer sind in Kotlin nicht erforderlich.
- In Kotlin werden Lambdaausdrücke immer mit geschweiften Klammern geschrieben; bei Java sind sie nur bei mehr als einer Anweisung erforderlich.
- In Java heißen die Methoden zum Ausführen der Funktionen je nach Typ anders (
accept,run, …); in Kotlin wird die Parameterliste direkt hinter die Funktion geschrieben.
Dokumentation: Lambdas
Exception Handling
| Java | Kotlin |
|---|---|
|
|
|
|
- Wichtigster Unterschied zu Java ist, dass es in Kotlin nur Runtime Exceptions und keine checked Exceptions gibt. Exceptions müssen deshalb nie deklariert oder behandelt werden.
tryist in Kotlin ein Ausdruck und kann deshalb direkt zum Initialisieren von Werten verwendet werden.
Dokumentation: Exceptions
Sichtbarkeit
- In Java sind Elemente standardmäßig innerhalb ihres Pakets sichtbar (package-private). In Kotlin
sind Elemenete standardmäßig
public. - package-private gibt es in Kotlin nicht; Kotlins
internalist ähnlich und macht Element innerhalb desselben Moduls (alles was zusammen kompiliert wird, z. B. ein Gradle/Maven-Projekt) sichtbar.
Dokumentation: Visibility Modifiers
Klassen
Deklaration und Vererbung
| Java | Kotlin |
|---|---|
|
|
|
|
|
|
|
|
|
|
- Klassen sind in Kotlin standardmäßig
final. Es kann nur von einer Klasse, die alsopendeklariert ist, abgeleitet werden. - Javas
extendsundimplementswird in Kotlin als Doppelpunkt geschrieben. - In Kotlin wird der Konstruktor der Oberklasse direkt bei der Deklaration aufgerufen. Deshalb steht im Beispiel
Shape()und nichtShape.
Dokumentation: Classes and Inheritance
Konstruktoren
| Java | Kotlin |
|---|---|
|
|
- Die Parameterliste hinter dem Namen einer Kotlin-Klasse ist der Primärkonstruktur.
- Konstruktorlogik landet in Kotlin-Klassen im
init-Block.
| Java | Kotlin |
|---|---|
|
|
- Für Konstruktorparamter mit vorangestelltem
vallegt der Compiler ein Property an, das nur gelesen werden kann;varergibt ein änderbares Property. - Hilfskonstruktoren werden in Kotlin mit dem Schlüsselwort
constructorgeschrieben und müssen mit einem Doppelpunkt getrennt den Primärkonstruktur (this(...)) aufrufen.
| Java | Kotlin |
|---|---|
|
|
- Der Konstruktor der Oberklasse wird in Kotlin direkt hinter den Klassennamen geschrieben. Im Beispiel nimmt der Konstruktor von
Squareden Parametercolorentgegen und reicht ihn anShapeweiter.
| Java | Kotlin |
|---|---|
|
- Wenn in Kotlin Annotationen wie
@Injectoder Modifizierer wiepublicvor den Primärkonstruktor geschrieben werden, muss das Schlüsselwortconstructorverwendet werden.
Instantiierung
| Java | Kotlin |
|---|---|
|
|
Objekte werden in Kotlin ohne das Schlüsselwort new erzeugt.
Getter/Setter und Properties
| Java | Kotlin |
|---|---|
|
|
|
|
|
|
|
|
- Ein
get...- undset...-Methodenpaar wird in Kotlin durch ein veränderliches Property ersetzt. - Wenn ein Wert nur gelesen werden soll, wird in Java ein Getter verwendet und in Kotlin ein
val-Property. - Logik im Getter wird in Kotlin hinter
get()geschrieben. - Kotlin-Klassen haben keine Felder, sondern nur Properties; wenn trotzdem direkt das Backing Field benötigt wird, kann es über den Namen
fieldangesprochen werden.
Dokumentation: Properties
Statische Elemente
| Java | Kotlin |
|---|---|
|
|
|
|
- Das Schlüsselwort
staticgibt es in Kotlin nicht. Dafür gibt es Objektliterale, wie das Companion Object. - Statischen Methoden einer Java-Klasse entsprechen in Kotlin die methoden des Companion Object einer Klasse.
- Ein Companion wird verwendet, wenn die Funktionen darin einen direkten Bezug zur umgebenden Klasse haben.
- Wenn Funktionen, wie Utility-Funktionen, für sich selbst stehen, können sie in Kotlin einfach auf höchste Ebene in die Datei geschrieben werden.
- Wenn eine Methode wirklich statisch sein soll, kann in Kotlin die Annotation
@JvmStaticverwendet werden.
Dokumentation: Companion Objects
Datenklassen
| Java | Kotlin |
|---|---|
|
|
- Für Objekte, die in erster Linie Daten enthalten, eigenen sich Datenklassen (
data class). - Der Compiler erzeugt die Methoden
equals,hashCode,toString,copyundcomponentN. MitcomponentN-Funktionen kann ein Objekt zerlegt werden:val (x, y) = point - Im Java-Beispiel hätten eigentlich auch
public finalFelder gereicht, aber mit Gettern entspricht es den Kotlin Properties (val).
Dokumentation: Data Classes
Enums
| Java | Kotlin |
|---|---|
|
|
|
|
- In Java wird nur
enumgeschrieben, in Kotlinenum class. - Wenn die Enum-Werte parametrisiert werden sollen, werden in Kotlin mit dem Primärkonstruktur und
valvor den Parametern gleich Felder dafür angelegt.
Dokumentation: Enum Classes
Annotationen
| Java | Kotlin |
|---|---|
|
|
|
|
- Statt
@interfacewird eine Annoation in Kotlin mitannoation classdefiniert. - Annotationsparameter sind in Kotlin Properties der Klasse.
Dokumentation: Annotations
Schnittstellen
| Java | Kotlin |
|---|---|
|
|
|
|
- Bis auf die kleinen, grundsätzlichen Syntaxunterschiede (z. B. Funktionssyntax, Semikolon) sehen Schnittstellen in beiden Sprachen praktisch gleich aus.
- Das Schlüsselwort
defaultfür implementierte Methoden wird nur in Java benötigt. - Statt
implementsin Java wird in Kotlin:geschrieben. - Javas
@Overrideentsprichtoverridein Kotlin.
Dokumentation: Interfaces
Delegation
| Java | Kotlin |
|---|---|
|
|
In Kotlin sorgt das Schlüsselwort by gefolgt von einer Referenz auf das Objekt, an das delegiert wird, dafür dass die nötigen Methoden erzeugt werden. Damit gibt es in Kotlin endlich eine komfortable Möglichkeit, um das Prinzip “composition over inheritance” umzusetzen.
Dokumentation: Delegation
Import
| Java | Kotlin |
|---|---|
|
|
|
|
- Statische Elemente können in Kotlin ohne besondere Syntax importiert werden.
- In Kotlin können mit
asAliasnamen vergeben werden:
import java.util.Collections.max as maximum
Dokumentation: Packages
Typprüfung
| Java | Kotlin |
|---|---|
|
|
Dokumentation: is and !is Operartors
Typumwandlung (Cast)
| Java | Kotlin |
|---|---|
|
|
|
|
- “Sichere” Typumwandlungen werfen keine Exceptions, sondern geben im Fehlerfall
nullzurück. In Kotlin werden sie mitas?geschrieben. Der Zieltyp ist “nullable” (B?und nichtB).
Dokumentation: Type Checks and Casts
null
| Java | Kotlin |
|---|---|
|
|
|
|
|
|
- In Kotlin muss eine Typangabe mit Fragezeichen versehen werden, wenn
nullals Wert erlaubt sein soll. Java kennt keine Null-Prüfung durch den Compiler. - Unsichere Derefenzierung muss in Kotlin mit
!!gekennzeichnet werden. - Sichere Derefenzierung erfolgt in Kotlin mit einem Fragezeichen.
Dokumentation: Null Safety
Java automatisch in Kotlin konvertieren
IntelliJ IDEA kann Java auch automatisch in Kotlin konvertieren. Dazu kannst du im Menü “Code” den Eintrag “Konvert Java File to Kotlin File” auswählen.
In der Online-IDE, try.kotlinlang.org, gibt es am oberen Rand die Funktionalität “Convert from Java”, mit der sich mal schnell ein Code-Schnipsel übersetzen lässt.
In jedem Fall sollte man aber noch mal einen kritischen Blick auf das Ergebnis werfen, denn bei sehr kompliziertem Code kann es auch schon mal zu kleinen Unstimmigkeiten kommen. Und manchmal kann man den erzeugten Kotlin-Code auch noch weiter vereinfachen.