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.
var
steht für (veränderliche) Variablenval
steht 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
xxxOf
benannt 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. it
ist in Kotlin der Standardname eines einzelnen Parameters eines Lambdaausdrucks.
Weitere Beispiele bei Stackoverflow.com
Bedingungen mit if
Java | Kotlin |
---|---|
|
|
|
|
if
ist 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
in
geschrieben und die Typangabe ist optional. - Wenn Array-Elemente mit einem Index durchlaufen werden sollen, steht in Kotlin die Eigenschaft
indices
des Arrays zur Verfügung. Der Compiler macht daraus eine optimale Implementierung die keine weiteren Objekte erzeugt. 1..10
ist 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
when
ist Javasswitch
ähnlich. - Es gibt bei
when
keinen “Durchfall” und deshalb auch kann man auch nie wieder einbreak
vergessen. - Bei
when
können mehrere Fälle mit Komma getrennt aufgeführt werden. default
in Java entsprichtelse
in Kotlin.- Im Gegensatz zu
switch
hatwhen
einen Wert und kann direkt einer Variablen zugewiesen werden. when
kann 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
. void
als 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üsselwortvararg
geschrieben.
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.
try
ist 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
internal
ist ä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 alsopen
deklariert ist, abgeleitet werden. - Javas
extends
undimplements
wird 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
val
legt der Compiler ein Property an, das nur gelesen werden kann;var
ergibt ein änderbares Property. - Hilfskonstruktoren werden in Kotlin mit dem Schlüsselwort
constructor
geschrieben 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
Square
den Parametercolor
entgegen und reicht ihn anShape
weiter.
Java | Kotlin |
---|---|
|
- Wenn in Kotlin Annotationen wie
@Inject
oder Modifizierer wiepublic
vor den Primärkonstruktor geschrieben werden, muss das Schlüsselwortconstructor
verwendet 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
field
angesprochen werden.
Dokumentation: Properties
Statische Elemente
Java | Kotlin |
---|---|
|
|
|
|
- Das Schlüsselwort
static
gibt 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
@JvmStatic
verwendet 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
,copy
undcomponentN
. MitcomponentN
-Funktionen kann ein Objekt zerlegt werden:val (x, y) = point
- Im Java-Beispiel hätten eigentlich auch
public final
Felder gereicht, aber mit Gettern entspricht es den Kotlin Properties (val
).
Dokumentation: Data Classes
Enums
Java | Kotlin |
---|---|
|
|
|
|
- In Java wird nur
enum
geschrieben, in Kotlinenum class
. - Wenn die Enum-Werte parametrisiert werden sollen, werden in Kotlin mit dem Primärkonstruktur und
val
vor den Parametern gleich Felder dafür angelegt.
Dokumentation: Enum Classes
Annotationen
Java | Kotlin |
---|---|
|
|
|
|
- Statt
@interface
wird eine Annoation in Kotlin mitannoation class
definiert. - 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
default
für implementierte Methoden wird nur in Java benötigt. - Statt
implements
in Java wird in Kotlin:
geschrieben. - Javas
@Override
entsprichtoverride
in 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
as
Aliasnamen 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
null
zurü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
null
als 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.