Kotlin – der neue Stern am Java Himmel (JUG HH)

Kotlin – der neue Stern am Java Himmel (JUG HH)

Schreiben Sie immer noch ellenlangen Boilerplate Code und stolpern in Ihren Projekten über Nullpointer Exceptions? Mit Kotlin gehört beides der Vergangenheit an! Kotlin ist eine statisch typisierte Sprache, die für die Entwicklung großer Projekte wie gemacht ist. Dabei besticht sie sowohl mit einer flachen Lernkurve als auch einer hervorragenden Kompatibilität zu bestehendem Java Code.

2bbc93067ceb6da9b3dd02f4e9a32c69?s=128

@dirkdittert

February 01, 2017
Tweet

Transcript

  1. 2.

    Kotlin Was ist Kotlin? 2 Eine Insel, ca. 30km 


    westlich von St. Petersburg 
 in der Ostsee Peter der Große eroberte die 
 Insel 1703 von den Schweden 
 und gründete auf der Insel die 
 Festungsstadt Kronstadt Kronstädter Pegel (am Fuße 
 der Festung): Höhenbezug 
 des früheren Ostblocks und 
 bis 1993 auch der DDR
  2. 3.

    Kotlin – der neue Stern am Java Himmel? Was ist

    Kotlin? Eine statisch typisierte Programmiersprache. Programme können in JVM Bytecode und Javascript übersetzt werden Ziele der Sprache: Spaß bei der Entwicklung Flache Lernkurve Hohe Interoperabilität mit Java Maximale Unterstützung durch die IDE Pragmatische Lösungsansätze Vater der Sprache ist Andrey Breslav (JetBrains) 3
  3. 4.

    Kotlin – der neue Stern am Java Himmel? Die Entwicklung

    seit Version 1.0 Aktuell ist 1.1 (Beta) Kotlin: Apache 2 Lizenz IDE Plugin ist Open Source und in der kostenlosen Version der JetBrains IDEs enthalten Die Sprache wird mit einem Team von ca. 35 Personen aktiv weiter entwickelt 4 Issues fixed for 0 100 200 300 400 1.0.1 1.0.2 1.0.3 1.0.4 1.0.5 1.0.6
  4. 6.

    Kotlin – der neue Stern am Java Himmel? Frameworks Spring

    Boot: h p://bit.ly/1YM9PON Kotlin als DSL für Gradle: h p://bit.ly/1swfQVp Exposed (Kotlin SQL Framework): h p://bit.ly/1RfSWGv Anko (DSL für Android Entwicklung): h p://bit.ly/1swfqyh funKTionale (Funktionale Erweiterungen): h p://bit.ly/1U5Vzz1 RxKotlin (Adapter für RxJava): h p://bit.ly/1OReE9e HamKrest (Kotlin Portierung der Hamcrest Matcher): h p://bit.ly/241LMwC KotlinTest (Testing Framework): h p://bit.ly/29lgLQT und vieles andere mehr! 6
  5. 7.

    Kotlin – der neue Stern am Java Himmel? Hinweis Die

    folgenden Codebeispiele verwenden aus ästhetischen Gründen mathematische Symbole ( ->, ==, !=, <=) im Code. Dabei handelt es sich um einen Darstellungsmodus in IntelliJ IDEA in Zusammenspiel mit den Ligaturen der Schri art Fira Code. Beim Editieren werden die gewohnten und aus Java bekannten Zeichen verwendet (->, ==, !=, <=). Dies ist eine Funktionalität der Entwicklungsumgebung, nicht von Kotlin. 7
  6. 8.

    Kotlin – der neue Stern am Java Himmel? Hello World!

    package tfo
 
 data class KotlinEvent(val name: String, val ort: String)
 
 
 fun main(args: Array<String>) {
 val event = KotlinEvent("Java Usergroup", "Hamburg")
 println("Herzlich willkommen ${event.name} in ${event.ort}!")
 } 8 > Herzlich willkommen Java Usergroup in Hamburg! > > Process finished with exit code 0
  7. 9.
  8. 10.

    Kotlin – der neue Stern am Java Himmel? Die Menge

    der Kleinigkeiten ist groß! Keine Strichpunkte, kein new 9
  9. 11.

    Kotlin – der neue Stern am Java Himmel? Die Menge

    der Kleinigkeiten ist groß! Keine Strichpunkte, kein new Variablendeklaration mit val und var; Typ kann automatisch abgeleitet werden
 val str = """A multiline string
 with Backslashes \ from ${Date()}""".trimIndent()
 
 var firstExecution: LocalTime? = null 9
  10. 12.

    Kotlin – der neue Stern am Java Himmel? Die Menge

    der Kleinigkeiten ist groß! Keine Strichpunkte, kein new Variablendeklaration mit val und var; Typ kann automatisch abgeleitet werden
 val str = """A multiline string
 with Backslashes \ from ${Date()}""".trimIndent()
 
 var firstExecution: LocalTime? = null Einfache Funktionen können sehr kurz formuliert werden, da viele Sprachkonstrukte Ausdrücke sind:
 fun isEven(i: Int) = if (i.rem(2) == 0) "gerade" else "ungerade" 9
  11. 13.

    Kotlin – der neue Stern am Java Himmel? Die Menge

    der Kleinigkeiten ist groß! Keine Strichpunkte, kein new Variablendeklaration mit val und var; Typ kann automatisch abgeleitet werden
 val str = """A multiline string
 with Backslashes \ from ${Date()}""".trimIndent()
 
 var firstExecution: LocalTime? = null Einfache Funktionen können sehr kurz formuliert werden, da viele Sprachkonstrukte Ausdrücke sind:
 fun isEven(i: Int) = if (i.rem(2) == 0) "gerade" else "ungerade" Einige Java Sprachelemente sind in Kotlin Bibliotheksfunktionen: try-with-Resources (use(block: (T) -> R): R) synchronized (synchronized(lock: Any, block: () -> R): R) 9
  12. 14.

    Kotlin – der neue Stern am Java Himmel? Properties Es

    gibt keine Member Variablen, nur Properties
 println(firstExecution.hour) Compiler generiert Ge er (und Se er) für Properties; diese können durch eigenen Code ersetzt werden Properties können delegiert werden
 class PropertiesExample {
 var p1: String by Delegates.notNull()
 } Ge er/Se er aus Java-Code können in Kotlin als Properties verwendet werden 10
  13. 15.

    Kotlin – der neue Stern am Java Himmel? Operatoren (1)

    Operatoren können überladen werden
 data class Complex(val re: Double, val im: Double) {
 operator fun plus(other: Complex) = Complex(re + other.re, im + other.im)
 operator fun minus(other: Complex) = Complex(re - other.re, im - other.im)
 }
 
 
 val c1 = Complex(3.0, 5.0)
 val c2 = Complex(4.0, 6.0)
 val result = c1 + c2 Die Auswertungsreihenfolge und die Menge der Operatoren ist fest vorgegeben 11
  14. 16.

    Kotlin – der neue Stern am Java Himmel? Die großen

    Unterschiede zu Java Kotlin kennt kein static! Java Klassenmethoden werden in Kotlin in Companion Objects untergebracht
 class ContentParser {
 companion object {
 fun create(): ContentParser {
 return ContentParser()
 }
 }
 }
 
 // Aufruf
 ContentParser.create() Companion Objects sind normale Objektinstanzen und können dadurch auch Interfaces implementieren 12
  15. 17.

    Kotlin – der neue Stern am Java Himmel? Data Classes

    (1) Data Classes sind Klassen, die als Wert- Container dienen Der Compiler generiert alle zugehörigen Hilfsmethoden automatisch Data Classes können um eigene Methoden erweitert werden Ab Version 1.1 kann von Basisklassen geerbt werden 13 data class JavaPerson(
 val lastname: String, 
 val firstname: String, 
 var age: Int?
 )
  16. 18.

    Kotlin – der neue Stern am Java Himmel? Data Classes

    (1) Data Classes sind Klassen, die als Wert- Container dienen Der Compiler generiert alle zugehörigen Hilfsmethoden automatisch Data Classes können um eigene Methoden erweitert werden Ab Version 1.1 kann von Basisklassen geerbt werden 13 data class JavaPerson(
 val lastname: String, 
 val firstname: String, 
 var age: Int?
 )
  17. 19.

    Kotlin – der neue Stern am Java Himmel? Data Classes

    (2) data class JavaPerson(
 val lastname: String, 
 val firstname: String, 
 var age: Int?
 ) 14
  18. 20.

    Kotlin – der neue Stern am Java Himmel? Data Classes

    (2) data class JavaPerson(
 val lastname: String, 
 val firstname: String, 
 var age: Int?
 ) 14 @Override public boolean equals(Object o) {
 if (this == o) { return true; }
 if (o == null || getClass() != o.getClass()) { return false; }
 JavaPerson that = (JavaPerson) o;
 if (!lastname.equals(that.lastname)) { return false; }
 if (!firstname.equals(that.firstname)) { return false; }
 return age != null ? age.equals(that.age) : that.age == null;
 } @Override
 public int hashCode() {
 int result = lastname.hashCode();
 result = 31 * result + firstname.hashCode();
 result = 31 * result + (age != null ? age.hashCode() : 0);
 return result;
 }
 
 @Override
 public String toString() {
 final StringBuilder sb = new StringBuilder("JavaPerson{");
 sb.append("lastname='").append(lastname).append('\'');
 sb.append(", firstname='").append(firstname).append('\'');
 sb.append(", age=").append(age);
 sb.append('}');
 return sb.toString();
 }
 
 @NotNull public JavaPerson copy(@NotNull String lastname, 
 @NotNull String firstname, @Nullable Integer age) {
 return new JavaPerson(lastname, firstname, age);
 }
 }
 public final class JavaPerson {
 private final String lastname, firstname;
 private Integer age;
 
 public JavaPerson(@NotNull String last, 
 @NotNull String first, @Nullable Integer age) {
 this.lastname = Objects.requireNonNull(lastname);
 this.firstname = Objects.requireNonNull(firstname);
 this.age = age;
 }
 
 @NotNull public String getLastname() { return lastname; }
 @NotNull public String getFirstname() { return firstname; }
 @Nullable public Integer getAge() { return age; }
 @NotNull public String component1() { return lastname; }
 @NotNull public String component2() { return firstname; }
 @Nullable public Integer component3() { return age; }
 
 public void setAge(Integer a) { this.age = Objects.requireNonNull(a); }
  19. 21.

    Kotlin – der neue Stern am Java Himmel? Funktionen Funktionen

    sind eigenständige Sprachelemente und können in Kotlin ohne Klassen existieren Funktionen können innerhalb von Funktionen deklariert werden
 fun traverse(list: List<String>) {
 fun recurse(list: List<String>, index: Int) {
 
 }
 
 recurse(list, 0)
 } Funktionen können als inline deklariert werden
 public inline fun <T> Iterable<T>.forEach(action: (T) -> Unit): Unit {
 for (element in this) action(element)
 }
 Code von Inline Funktionen funktioniert wie Makros und wird direkt an der Stelle des Aufrufs generiert (d.h. kein Funktionsaufruf im ByteCode) 15
  20. 22.

    Kotlin – der neue Stern am Java Himmel? Extension Functions

    Extension Functions ermöglichen die Erweiterung beliebiger Klassen (oder Companion Objects) um eigene Methoden Extension Functions werden durch den Compiler als statische Methoden realisiert und müssen dadurch zustandslos sein Beispiel:
 fun MutableList<Int>.swap(index1: Int, index2: Int) {
 val tmp = this[index1] // 'this' entspricht der Instanz der Liste
 this[index1] = this[index2]
 this[index2] = tmp
 } Extension Functions werden immer statisch aufgelöst, nicht virtuell (also nicht abhängig vom Typ der tatsächlichen Objektinstanz)! 16
  21. 23.

    Kotlin – der neue Stern am Java Himmel? Eine Frage

    des Standpunkts Kotlin erlaubt zu bestimmen, was im Code unter this zu verstehen ist Bei Extension Functions ist dies die Instanz der Klasse, auf der die Funktion aufgerufen wird Bei Lambdas kann ein Objekt, das als „Empfänger“ dienen soll, angegeben werden:
 fun <T, R> with(rec: T, block: T.() -> R): R = rec.block()
 
 rec: Receiver vom Typ T 
 block: Funktion ohne Parameter mit einem Receiver vom Typ T und einem 
 Rückgabewert vom Typ R Extrem mächtig, aber die „fremdeste“ Syntax für Java Entwickler in Kotlin. 17
  22. 24.

    Kotlin – der neue Stern am Java Himmel? Praktische Idiome

    with – Ru den Block mit dem ersten Parameter als Empfänger (this) auf und gibt das Ergebnis zurück
 val s = with(StringBuilder()) {
 append("Starting ")
 append("Countdown ")
 (10 downTo 1).joinTo(this, ", ")
 toString()
 } 18
  23. 25.

    Kotlin – der neue Stern am Java Himmel? Praktische Idiome

    with – Ru den Block mit dem ersten Parameter als Empfänger (this) auf und gibt das Ergebnis zurück
 val s = with(StringBuilder()) {
 append("Starting ")
 append("Countdown ")
 (10 downTo 1).joinTo(this, ", ")
 toString()
 } 18 apply – ähnlich wie with; gibt aber immer den Empfänger (this) zurück
 val b = JButton().apply {
 isVisible = true
 text = "Hello!"
 minimumSize = Dimension(100, 20)
 addActionListener {
 println("Button was clicked")
 }
 }
  24. 26.

    Kotlin – der neue Stern am Java Himmel? Praktische Idiome

    let – ru den Block mit dem Wert als Argument auf 
 findButton()?.let { btn ->
 btn.isVisible = true
 btn.text = "Hello!"
 btn.minimumSize = Dimension(100, 20)
 btn.addActionListener {
 println("Button was clicked")
 }
 } let stellt dem zurück gegebenen Wert einen eigenen (beschränkten) Gültigkeitsbereich zur Verfügung, so dass keine temporäre Variable verwendet werden muss 19
  25. 27.

    Kotlin – der neue Stern am Java Himmel? Vergleich val

    s = with(StringBuilder()) {
 append("Starting ")
 append("Countdown ")
 (10 downTo 1).joinTo(this, ", ")
 toString()
 } 20 final StringBuilder builder = new StringBuilder();
 builder.append("Starting ");
 builder.append("Countdown ");
 for (int i = 10; i >= 2; i --) {
 builder.append(i);
 builder.append(", ");
 }
 builder.append("1");
 final String s = builder.toString();

  26. 28.

    Kotlin – der neue Stern am Java Himmel? Vergleich val

    s = with(StringBuilder()) {
 append("Starting ")
 append("Countdown ")
 (10 downTo 1).joinTo(this, ", ")
 toString()
 } 20 final StringBuilder builder = new StringBuilder();
 builder.append("Starting ");
 builder.append("Countdown ");
 for (int i = 10; i >= 2; i --) {
 builder.append(i);
 builder.append(", ");
 }
 builder.append("1");
 final String s = builder.toString();
 Kotlin ist sehr prägnant und lenkt den Fokus auf die Intention während die Syntax von Java eher davon ablenkt Kotlin Variante funktioniert überall (d.h. auch für Properties einer Klasse/ globale Properties) Kein Overhead, da with eine inline Funktion ist
  27. 29.

    Kotlin – der neue Stern am Java Himmel? Auf die

    Spitze getrieben… Wenn man die Kotlin Bibliothek schon im Projekt hat, kann man sie auch nutzen... Kotlin Code ist in der Regel gut von Java aus nutzbar! 21 final StringBuilder builder = new StringBuilder();
 builder.append("Starting ");
 builder.append("Countdown ");
 CollectionsKt.joinTo(RangesKt.downTo(10, 1), builder, ", ", "", "", -1, " ...", null);
 final String s = builder.toString();

  28. 31.

    Kotlin – der neue Stern am Java Himmel? Null (1)

    null ist fester Bestandteil des Typsystems:
 var nullableString: String? = null
 var nonNullableString: String = "Hello world!" 22
  29. 32.

    Kotlin – der neue Stern am Java Himmel? Null (1)

    null ist fester Bestandteil des Typsystems:
 var nullableString: String? = null
 var nonNullableString: String = "Hello world!" Compiler generiert für alle Methodenaufrufe automatisch entsprechende Annotationen und Prüfungen
 fun process(str: String) { /* ... */ } // Kotlin
 
 public void process(@NotNull String string) { // Java
 Objects.requireNonNull(string);
 // ...
 } 22
  30. 33.

    Kotlin – der neue Stern am Java Himmel? Null (1)

    null ist fester Bestandteil des Typsystems:
 var nullableString: String? = null
 var nonNullableString: String = "Hello world!" Compiler generiert für alle Methodenaufrufe automatisch entsprechende Annotationen und Prüfungen
 fun process(str: String) { /* ... */ } // Kotlin
 
 public void process(@NotNull String string) { // Java
 Objects.requireNonNull(string);
 // ...
 } Compiler verwendet Prüfungen für automatische Typkonvertierungen:
 val firstExecution: LocalTime? = null
 println(firstExecution.hour) // Compilerfehler
 if (firstExecution != null) {
 println(firstExecution.hour) // ok (da firstExecution als val deklariert!) 
 } 22
  31. 35.

    Kotlin – der neue Stern am Java Himmel? Null (2)

    Annotierte Java-Methoden integrieren sich nahtlos mit Kotlin. Fehlen diese, verhält sich Kotlin ähnlich wie Java (d.h. reduzierte Prüfungen durch den Compiler) 23
  32. 36.

    Kotlin – der neue Stern am Java Himmel? Null (2)

    Annotierte Java-Methoden integrieren sich nahtlos mit Kotlin. Fehlen diese, verhält sich Kotlin ähnlich wie Java (d.h. reduzierte Prüfungen durch den Compiler) Manchmal gelten andere Regeln (z.B. bei Dependency Injection):
 class ClassWithInjection {
 @Inject
 lateinit var shouldNeverBeNull: String
 fun prinLength() = shouldNeverBeNull.length
 } 23
  33. 37.

    Kotlin – der neue Stern am Java Himmel? Null (2)

    Annotierte Java-Methoden integrieren sich nahtlos mit Kotlin. Fehlen diese, verhält sich Kotlin ähnlich wie Java (d.h. reduzierte Prüfungen durch den Compiler) Manchmal gelten andere Regeln (z.B. bei Dependency Injection):
 class ClassWithInjection {
 @Inject
 lateinit var shouldNeverBeNull: String
 fun prinLength() = shouldNeverBeNull.length
 } Praktische Prüfungen:
 Erzwinge Wert ungleich Null: str !!.toUpperCase().toByteArray().size
 Aufruf, falls nicht Null: str?.toUpperCase()?.toByteArray()?.size 23
  34. 38.

    Kotlin – der neue Stern am Java Himmel? Arrays Integration

    von Arrays ist problematisch und die Verwendung wird nicht empfohlen: Vergleich von Arrays verhält sich anders als der Vergleich von Listen
 arrayOf(1, 2, 3) == arrayOf(1, 2, 3) // false
 listOf(1, 2, 3) == listOf(1, 2, 3) // true Initialisierung mehrdimensionaler Arrays ist für „Profis“
 val data: Array<Array<Boolean >> = 
 Array(width) { Array(height) { false } } Annotationen werden mit Arrays etwas länglich
 public @interface RequestMapping { // gekürzt, aus Spring
 String [] path() default {};
 }
 
 @RequestMapping(path = arrayOf("/")) 24
  35. 39.

    Kotlin – der neue Stern am Java Himmel? Unterstützung für

    Java 8/9 Version 1.0 und Version 1.1 sind für Java 6 ausgelegt Kotlin kann Java 8 Bytecode erzeugen, verwendet aber momentan nur einige der neuen Möglichkeiten (z.B. werden für Lambdas noch Klassen generiert) Kotlin bindet Klassen und Methoden aus dem JDK transparent ein, so dass auch die in neueren JDKs hinzugekommene Funktionalität zur Verfügung steht Default Methoden in Interfaces können genutzt, aber nicht definiert werden Standardbibliothek ist seit 1.1 nun JDK-spezifisch: kotlin-stdlib, kotlin- stdlib-jre7, kotlin-stdlib-jre8 25
  36. 40.

    Kotlin – der neue Stern am Java Himmel? Roadmap für

    Kotlin 1.1 (aktuell Beta) Spracherweiterungen werden im Kotlin Evolution and Enhancement Process (KEEP) diskutiert: h ps://github.com/Kotlin/KEEP async/await/yield (h p://bit.ly/1Wi6hpR) Vererbung bei Data Classes Type Aliases
 typealias MouseEventHandler = (MouseEvent) -> Unit Destructuring Lambdas
 for ((k, v) in myMap) { /* 1.0 */ }
 myMap.forEach { (k, v) -> /* 1.1. */ } Unterstützung für Java 8/9 Unterstützung für Project Jigsaw 26
  37. 41.

    Kotlin – der neue Stern am Java Himmel? Coroutinen –

    on steroids! Coroutinen sind Instanzen unterbrechbarer Berechnungen Sie werden erzeugt und gestartet, ihre Ausführung ist aber nicht an bestimmte Threads gebunden Anwendung: asynchrone Berechnungen, Futures (Promises), Generatoren Coroutinen kommen in vielen Sprachen vor, sind dort aber fester Teil der Syntax Kotlin geht hier weiter und stellt nur die nötigen Bausteine zur Verfügung (Suspension, Continuation). Dies kann von verschiedenen Bibliotheken genutzt werden Reactive, Completable Future, NIO, … Experimentelles Sprachfeature in Kotlin 1.1 27
  38. 42.

    Kotlin – der neue Stern am Java Himmel? Beispiel fun

    primesAfter(start: Int) = buildSequence { var number = start while (true) { if (isPrime(number)) { yield(number) } number ++ } } fun main(args: Array<String>) { primesAfter(7).take(10).forEach( ::println) } 28
  39. 43.

    Kotlin – der neue Stern am Java Himmel? Roadmap für

    Kotlin 1.1 Offizielle Unterstützung von Javascript als Zielpla form Viele Javascript Features wurden bereits nach 1.0.x zurück portiert (z.B. AMD/ CommonJS Support) Unterstützung aller neuen Kotlin 1.1 Sprachkonstrukte auch unter Javascript Herausforderungen Keine Reflection Unterstützung unter Javascript Viele Kleinigkeiten (println(2147483647 + 2147483647) oder println(intArrayOf(1)[1])) Integration der Typdefinitionen der wichtigsten Javascript Frameworks (aus der Typescript Community) 29
  40. 44.

    Kotlin – der neue Stern am Java Himmel? Fazit Produktionstauglich:

    Ja (ab 1.0.2)! Für Javasscript und Vorsichtige ab Version 1.1.1 Lernkurve ist für Java Entwickler relativ flach Syntax ist modern, orientiert sich an der Praxis und macht Spaß Behandlung von null ist nicht neu (IntelliJ IDEA), aber jetzt deutlich besser lesbar Leider muss auch Kotlin mit den Schwächen der JVM Implementierung leben: Arrays Type Erasure bei Generics Fehlende Value Types (d.h. int vs. Integer) mit den Konsequenzen (Boxing) 30