Kofler | Kotlin | E-Book | sack.de
E-Book

E-Book, Deutsch, 823 Seiten

Reihe: Rheinwerk Computing

Kofler Kotlin

Das umfassende Handbuch
1. Auflage 2020
ISBN: 978-3-8362-7279-7
Verlag: Rheinwerk
Format: EPUB
Kopierschutz: 0 - No protection

Das umfassende Handbuch

E-Book, Deutsch, 823 Seiten

Reihe: Rheinwerk Computing

ISBN: 978-3-8362-7279-7
Verlag: Rheinwerk
Format: EPUB
Kopierschutz: 0 - No protection



Kotlin ist das neue Schweizer Taschenmesser in der Softwareentwicklung. Ob mobile Apps oder Geschäftslogik am Backend, ob objektorientierte Paradigmen oder funktionale Programmierung mit Lambdas: Kotlin vereint die Stärken zahlreicher beliebter Sprachen zu einem modern Werkzeug für alle Fälle. In diesem umfassenden Handbuch gibt Michael Kofler Ihnen dazu einen Einblick in alle Sprachfeatures und zeigt Ihnen, wie Sie zeitgemäß Software entwicklen.

Aus dem Inhalt:

  • Crashkurs für Java-Umsteiger
  • IDEs: IntelliJ und Android Studio
  • Operatoren, Datentypen, Variablen, Klassen, Methoden: Alle Grundlagen
  • Lambda-Ausdrücke und funktionale Programmierung
  • Objektorientierte Programmierung inkl. Extensions, Delegation und Generics
  • Asynrchrone Programmierung und Koroutinen
  • Netzwerkfunktionen, XML und JSON
  • App-Programmierung mit Jetpack und Jetpack Compose
  • Backend-Entwicklung mit Ktor und Exposed
  • REST-APIs entwicklen und anwenden
  • Pakete, Module und Importe


Dr. Michael Kofler studierte Telematik an der TU Graz. Er zählt zu den erfolgreichsten und vielseitigsten Computerbuchautoren im deutschen Sprachraum. Zu seinen Themengebieten zählen neben Linux auch macOS, MySQL, KVM, Visual Basic und Excel-VBA. Viele seiner Bücher wurden übersetzt. Michael Kofler arbeitet auch als Software-Entwickler, Berater sowie als Lehrbeauftragter an einer Fachhochschule.
Kofler Kotlin jetzt bestellen!

Autoren/Hrsg.


Weitere Infos & Material


Vorwort ... 13

TEIL I  Kotlin ... 17  1.  Hello World! ... 19  1.1 ... Über Kotlin ... 19  1.2 ... Installation ... 21  1.3 ... »Hello World!« mit und ohne IDE ausführen ... 24  2.  Crashkurs ... 29  2.1 ... Elementare Syntaxregeln ... 29  2.2 ... Konventionen ... 41  2.3 ... Von Java zu Kotlin ... 42  3.  Operatoren ... 47  3.1 ... Übersicht ... 47  3.2 ... Anmerkungen ... 49  3.3 ... Priorität von Operatoren ... 59  4.  Variablenverwaltung ... 61  4.1 ... Variablen ... 61  4.2 ... Unveränderliche Variablen ... 63  4.3 ... Konstanten und Enumerationen ... 64  4.4 ... Der Umgang mit »null« ... 65  5.  Datentypen ... 69  5.1 ... Die wichtigsten Kotlin-Datentypen ... 69  5.2 ... Zahlen ... 72  5.3 ... Bereiche (Ranges) ... 74  5.4 ... Zufallszahlen ... 76  5.5 ... Boolesche Ausdrücke ... 77  6.  Zeichenketten ... 79  6.1 ... Die Klasse »Char« ... 80  6.2 ... Die Klasse »String« ... 82  6.3 ... Mit Zeichenketten arbeiten ... 85  6.4 ... Beispiel: Passwortqualität testen ... 94  6.5 ... Die Klasse »StringBuilder« ... 97  7.  Datum und Uhrzeit ... 99  7.1 ... Neue Java-Klassen (»java.time«) ... 100  7.2 ... Herkömmliche Java-Klassen (»Date« und »Calendar«) ... 107  7.3 ... Die »Duration and Time Measurement API« (kotlin.time) ... 113  8.  Listen, Sets, Maps und Arrays ... 117  8.1 ... Listen ... 118  8.2 ... Sets ... 132  8.3 ... Maps ... 135  8.4 ... Sequenzen ... 136  8.5 ... Arrays ... 140  9.  Verzweigungen und Schleifen ... 147  9.1 ... Die »if«-Verzweigung ... 147  9.2 ... Die »when«-Verzweigung ... 150  9.3 ... Die »for«-Schleife ... 152  9.4 ... Die »while«-Schleife ... 154  9.5 ... Die »repeat«-Schleife ... 155  9.6 ... »break« und »continue« ... 156  9.7 ... Beispiele: Summen, Produkte, Duplikate und Co. ... 157

10.  Funktionen ... 163  10.1 ... Funktionen definieren und aufrufen ... 164  10.2 ... Parameter ... 168  10.3 ... Rekursion ... 172  10.4 ... Lokale Funktionen ... 175  10.5 ... Die »main«-Funktion ... 176  10.6 ... Beispiel: Pfadsuche ... 177

11.  Lambda-Ausdrücke und funktionale Programmierung ... 189  11.1 ... Hello Lambda! ... 190  11.2 ... Lambda-Ausdrücke und Funktionen für Fortgeschrittene ... 192  11.3 ... Beispiel: Funktionen erzeugen und verarbeiten ... 197  11.4 ... »map«, »filter«, »reduce« und Co. ... 199  11.5 ... Beispiel: Textanalyse mit Lambda-Ausdrücken ... 211  11.6 ... Beispiel: Dosenpyramide in drei Farben ... 213  11.7 ... Objekte verarbeiten (»apply«, »let«, »with« etc.) ... 218  11.8 ... Inline-Funktionen ... 223

12.  Klassen und Objekte ... 227  12.1 ... Klassen ... 227  12.2 ... Der Konstruktor ... 233  12.3 ... Eigenschaften ... 240  12.4 ... Eigenschaften später initialisieren ... 245  12.5 ... Zugriffssteuerung ... 249  12.6 ... Beispiel: Bankkonto ... 251  12.7 ... Objekte ohne Klassen ... 253  12.8 ... Beispiel: Quiz ... 261  12.9 ... Enumerationen ... 266

13.  Vererbung, Schnittstellen, Extensions ... 271  13.1 ... Vererbung ... 272  13.2 ... Vererbung (Konstruktoren, abstrakte Klassen, Polymorphie) ... 278  13.3 ... Die Klasse »Any« ... 284  13.4 ... Datenklassen ... 287  13.5 ... Beispiel: Schachfiguren ... 289  13.6 ... Schnittstellen ... 296  13.7 ... Beispiel: Geometrische Objekte mit Schnittstellen verarbeiten ... 303  13.8 ... Extensions ... 304  13.9 ... Receiver-Funktionen ... 309  13.10 ... Infix-Funktionen ... 312  13.11 ... Operator Overloading ... 313  13.12 ... Beispiel: Rechnen mit komplexen Zahlen ... 316  13.13 ... Delegation ... 317

14.  Reflection, Generics und Annotationen ... 327  14.1 ... Reflection ... 328  14.2 ... Generics ... 330  14.3 ... Generische Typen: Zusatzregeln und Sonderfälle ... 333  14.4 ... Annotationen ... 344  14.5 ... Type-safe Builder ... 348

15.  Exceptions ... 357  15.1 ... Fehlerabsicherung ... 358  15.2 ... Selbst Fehler auslösen (»throw«) ... 365  15.3 ... Arbeitstechniken ... 367

16.  Pakete, Importe und Module ... 369  16.1 ... Pakete ... 369  16.2 ... Importe ... 370  16.3 ... Module ... 373

TEIL II  Programmiertechniken ... 375

17.  Asynchrone Programmierung ... 377  17.1 ... Hello Coroutines! ... 378  17.2 ... Koroutinen ausführen ... 382  17.3 ... Koroutinen abbrechen ... 390  17.4 ... Exceptions in asynchronem Code ... 395  17.5 ... Den Zugriff auf gemeinsame Daten synchronisieren ... 398  17.6 ... Suspending Functions ... 401  17.7 ... Asynchroner Code in Android-Apps ... 404  17.8 ... Beispiel: Effizient numerisch integrieren ... 407

18.  Dateien verarbeiten (I/O, JSON, XML) ... 411  18.1 ... Umgang mit Dateien und Verzeichnissen ... 412  18.2 ... Textdateien lesen und schreiben ... 419  18.3 ... Download von Dateien ... 422  18.4 ... JSON und Serialisierung ... 422  18.5 ... JSON-Beispiel: Die »New-York-Times«-Bestseller ... 430  18.6 ... XML ... 432

19.  Datenbankzugriff (Exposed) ... 437  19.1 ... Hello Exposed! ... 438  19.2 ... Verbindungsaufbau und Transaktionen ... 442  19.3 ... Data Access Objects (DAO) ... 448  19.4 ... DAO-Beispiel: Bücherdatenbank ... 455  19.5 ... SQL als Domain-specific Language (DSL) ... 462

20.  JavaFX ... 473  20.1 ... Hello JavaFX! ... 473  20.2 ... TornadoFX ... 477

TEIL III  App-Entwicklung ... 481

21.  Hello Android! ... 483  21.1 ... Android Studio installieren ... 484  21.2 ... Das erste Projekt in Android Studio ... 486  21.3 ... Emulator einrichten ... 488  21.4 ... Smartphone einrichten ... 492  21.5 ... Aufbau eines Android-Studio-Projekts ... 494  21.6 ... Eigener Button, eigener Code ... 498  21.7 ... Personalisierung der App ... 505

22.  App: Fahrenheit-Umrechner ... 509  22.1 ... Layout ... 510  22.2 ... Der Code zur Temperaturumrechnung ... 512  22.3 ... Debugging ... 518  22.4 ... Screenshots ... 522

23.  Android Basics ... 525  23.1 ... Android-Grundlagen ... 525  23.2 ... Steuerelemente ... 527  23.3 ... Texte anzeigen und eingeben (»TextView«, »EditText«) ... 529  23.4 ... Buttons ... 533  23.5 ... ImageView ... 535  23.6 ... Layoutregeln ... 541  23.7 ... Listen und Tabellen (»RecyclerView«) ... 548  23.8 ... Preferences ... 561  23.9 ... Permissions ... 564

24.  Aktivitäten, Fragmente und Menüs ... 573  24.1 ... Aktivitäten und Fragmente ... 574  24.2 ... Beispiel: App mit drei leeren Fragmenten ... 576  24.3 ... Datenaustausch zwischen Fragmenten ... 586  24.4 ... Beispiel: Datenaustausch zwischen drei Fragmenten ... 593  24.5 ... Einfache Menüs (Overflow Menu) ... 597

25.  App: Währungsumrechner ... 603  25.1 ... Die Klasse »CurrencyCalculator« ... 604  25.2 ... Hauptaktivität ... 610  25.3 ... Fragment zur Währungsumrechnung (»MainFragment«) ... 611  25.4 ... Einstellungsfragment (»SetupFragment«) ... 616  25.5 ... Fragment mit App-Informationen (»AboutFragment«) ... 620

26.  Jetpack Compose ... 623  26.1 ... Hello Compose! ... 625  26.2 ... Steuerelemente ... 635  26.3 ... Container ... 641  26.4 ... Listen ... 645  26.5 ... Theming ... 648  26.6 ... Aktivitäten und Fragmente ... 651  26.7 ... Beispiel: Fahrenheit-Umrechner ... 656

TEIL IV  Backend und Server ... 661

27.  Hello Server! ... 663  27.1 ... Hello Ktor! ... 665  27.2 ... Beispiel: URL-Verkürzer ... 670  27.3 ... Beispiel: URL-Verkürzer mit Datenbank-Server ... 675

28.  Ktor-Programmiertechniken ... 681  28.1 ... Projekt- und Programmaufbau ... 682  28.2 ... Routing ... 684  28.3 ... Request und Response ... 690  28.4 ... HTML- und CSS-Dokumente zusammensetzen ... 694  28.5 ... REST-APIs ... 701  28.6 ... Authentifizierung ... 709  28.7 ... Ktor-Debugging ... 715

29.  App: Evaluierungssystem (Backend) ... 719  29.1 ... Projektaufbau ... 720  29.2 ... Datenbankdesign ... 723  29.3 ... Der Datenbank-Code ... 725  29.4 ... Weboberfläche ... 735  29.5 ... Die REST-API ... 745

30.  App: Evaluierungssystem (Client) ... 753  30.1 ... Den Ktor-Client in Android-Apps verwenden ... 755  30.2 ... Ktor-Client-Programmiertechniken ... 758  30.3 ... Projektaufbau der Evaluierungs-App ... 761  30.4 ... Liste der Evaluierungen anzeigen ... 766  30.5 ... Einmal-Login ... 772  30.6 ... Evaluierung durchführen ... 775  30.7 ... Evaluierungsergebnisse anzeigen ... 781  A.  IntelliJ, Android Studio und Gradle ... 783  A.1 ... IntelliJ und Android Studio ... 783  A.2 ... Gradle ... 795  Index ... 807


2    Crashkurs


Bevor ich Ihnen Kotlin in den nächsten Kapiteln systematisch vorstelle, gibt dieser Crashkurs einen ersten Überblick über die wichtigsten Syntaxregeln und hilft so bei der Orientierung. Der Crashkurs setzt voraus, dass Sie schon programmieren können und prinzipiell wissen, was Variablen, Funktionen usw. sind. Sollte das bei Ihnen nicht der Fall sein, ist es vermutlich besser, dieses Kapitel zu überspringen. (Generell richtet sich dieses Buch nicht primär an Programmiereinsteiger.)

Eine Motivation für diesen Crashkurs besteht darin, dass es unmöglich ist, eine Programmiersprache linear zu erklären. Egal, wo ich beginne – immer muss ich etwas anderes voraussetzen. Dieses Kapitel schafft insofern ein erstes Fundament. Seien Sie nicht irritiert, wenn Sie nicht jeden Begriff und jede Konstruktion auf Anhieb verstehen – in den weiteren Kapiteln folgen dann ausführlichere Erläuterungen sowie mehr Details und Varianten.

Das Kapitel endet mit einer kurzen Gegenüberstellung von Java- und Kotlin-Code. Wenn Sie schon mit Java programmiert haben, sehen Sie so auf ersten Blick einige wichtige Unterschiede zwischen Java und Kotlin.

2.1    Elementare Syntaxregeln


Kotlin-Anweisungen sind normalerweise einzeilig. Mehrzeilige Anweisungen sind erlaubt, wenn aufgrund von Klammern oder Operatoren klar ist, dass sie in der folgenden Zeile fortgesetzt werden:

println(
"Hello World!")
var a = 3 +
4 + 5

Wenn eine Zeile dagegen eine vollständige Anweisung bildet, ist eine Fortsetzung nicht möglich:

var b = 3
 + 4 + 5

Strichpunkte zum Abschluss von Anweisungen sind nicht erforderlich, aber erlaubt. Allerdings müssen Sie Strichpunkte verwenden, wenn Sie mehrere Anweisungen in einer Zeile anordnen möchten:

var a=3; var b=4; var c=5

Kommas


In Kotlin werden, wie in fast allen Programmiersprachen, Parameter durch Kommas getrennt:

val lst1 = listOf("Lorem", "ipsum", "dolores", "est")

Es ist erlaubt, auch nach dem letzten Parameter ein Komma anzugeben. Das ist vor allem dann praktisch, wenn Sie die Reihenfolge der Parameter später ändern wollen. Dann können Sie eine Zeile markieren und nach oben oder unten verschieben, ohne dass es Syntaxprobleme gibt:

val lst = listOf(
"est",
"Lorem",
"dolores",
"ipsum",
)

Kommentare


Einzeilige Kommentare werden mit // eingeleitet, mehrzeilige Kommentare starten mit /* und enden mit */. Derartige Kommentare dürfen auch verschachtelt werden.

var x = 4

Strukturierung


Code wird durch die geschwungenen Klammern { und } strukturiert. Wenn in einer Schleife, Verzweigung etc. nur eine Anweisung ausgeführt werden soll, dann dürfen die Klammern entfallen.

Code-Einrückungen sind optional und nicht Teil der Syntax. Es ist aber üblich, Code pro Ebene um vier Zeichen einzurücken. (In diesem Buch gibt es vereinzelt Listings, die mit nur zwei Zeichen pro Ebene eingerückt sind, um allzu viele Zeilenumbrüche zu vermeiden.)

Die meisten Anweisungen müssen sich innerhalb von Klassen oder Funktionen befinden. In der höchsten Ebene einer Code-Datei sind nur relativ wenige Konstrukte erlaubt, neben Klassen und Funktionen unter anderem Deklarationen von globalen Konstanten, Variablen oder Funktionen sowie Package- und Import-Anweisungen.

Variablen und Konstanten


Variablen müssen vor ihrer Verwendung mit var deklariert werden. Die Typangabe erfolgt nach einem Doppelpunkt hinter dem Variablennamen:

var l: Long

Die Typangabe darf entfallen, wenn die Variable sofort initialisiert wird. Kotlin entscheidet sich dann für einen geeigneten Datentyp, der sich später nicht mehr ändern kann.

var i = 3
i = "abc"

Kotlin kennt gleich zwei Arten von Konstanten:

  • Mit val deklarierte unveränderliche Variablen (read-only local variables) können zur Laufzeit einmalig mit einem beliebigen Wert initialisiert werden, dürfen sich dann aber nicht mehr ändern. In diesem Buch werden solche Konstanten als »unveränderliche Variablen« bezeichnet.

  • Werte von Konstanten, die mit const val deklariert sind, müssen dagegen bereits zum Zeitpunkt des Kompilierens feststehen. Derartige Konstanten sind allerdings nicht in an beliebigen Orten im Code erlaubt. Es ist üblich, const-Konstanten mit lauter Großbuchstaben zu benennen.

Das folgende Listing definiert die »echte« Konstante PI und initialisiert die unveränderliche Variable n mit einer Zufallszahl zwischen 0 und 10:

const val PI = 3.1415

val n = (0..10).random()

n = 7

Der Aufruf der random-Methode zeigt gleich auch eine Besonderheit von Kotlin: Bereiche (ranges) werden in der Form start..ende formuliert und auf verschiedene Weisen eingesetzt, unter anderem auch in Schleifen.

Umgang mit null


In Variablen ist der Zustand null im Sinne von »nicht initialisiert« unzulässig. Soll dies doch erlaubt werden, muss dem Datentyp ein Fragezeichen nachgestellt werden. Kotlin spricht dann von nullable types. Andere Programmiersprachen verwenden oft den Begriff Optional.

Die Schreibweise Type? ist sowohl für elementare Datentypen (Int, Double) als auch für allgemeine Klassen erlaubt.

var perhapsAResult: Int?
perhapsAResult = null
if (perhapsAResult is Int)
println("Ergebnis: " + perhapsAResult)
else
println("Kein Ergebnis verfügbar.")

Statt mit is Int können Sie die Valididät der Daten auch mit einem null-Test sicherstellen:


if (perhapsAResult != null)
println("Ergebnis: " + perhapsAResult)
else
println("Kein Ergebnis verfügbar.")

Zeichenketten


Gewöhnliche Zeichenketten werden zwischen doppelte Anführungszeichen gestellt:

val s = "abc"

Für Zeichenketten, die Sonderzeichen wie \ enthalten oder über mehrere Zeichen reichen sollen, ist die folgende Raw-Syntax mit der Zeichenkombination """ vorgesehen:

val fname = """C:\Users\kofler"""
println(fname)

Um bei mehrzeiligen Zeichenketten die Einrückung zu eliminieren, starten Sie die Zeichenkette in der zweiten Zeile und fügen ihr die Methode trimIndent hinzu:

val sql = """
SELECT * FROM mytable
WHERE id > 20
ORDER BY name""".trimIndent()
println(sql)



Innerhalb von Zeichenketten wird $name durch den Inhalt des Variablennamens sowie ${ausdruck} durch den ausgewerteten Ausdruck ersetzt (String-Interpolation). Die Funktion sin und die Konstante PI befinden sich im Paket kotlin.math, das importiert werden muss. (Wenn Sie die import-Anweisung vergessen, weist IntelliJ Sie darauf hin. Sie können das fehlende Kommando dann bequem mit (Alt)+(¢) in den Code einfügen.)

import kotlin.math.*
val n = 7
println("n=$n")
val pi4 = PI / 4
println("Sinus = ${sin(pi4)}")

Listen, Sets und Maps


Die wichtigste Datenstruktur zur Speicherung mehrerer gleichartiger Daten sind Listen. Die beiden folgenden Zeilen definieren zwei unveränderliche Listen, einmal...


Kofler, Michael
Dr. Michael Kofler studierte Telematik an der TU Graz. Er zählt zu den erfolgreichsten und vielseitigsten Computerbuchautoren im deutschen Sprachraum. Zu seinen Themengebieten zählen neben Linux auch macOS, MySQL, KVM, Visual Basic und Excel-VBA. Viele seiner Bücher wurden übersetzt. Michael Kofler arbeitet auch als Software-Entwickler, Berater sowie als Lehrbeauftragter an einer Fachhochschule.



Ihre Fragen, Wünsche oder Anmerkungen
Vorname*
Nachname*
Ihre E-Mail-Adresse*
Kundennr.
Ihre Nachricht*
Lediglich mit * gekennzeichnete Felder sind Pflichtfelder.
Wenn Sie die im Kontaktformular eingegebenen Daten durch Klick auf den nachfolgenden Button übersenden, erklären Sie sich damit einverstanden, dass wir Ihr Angaben für die Beantwortung Ihrer Anfrage verwenden. Selbstverständlich werden Ihre Daten vertraulich behandelt und nicht an Dritte weitergegeben. Sie können der Verwendung Ihrer Daten jederzeit widersprechen. Das Datenhandling bei Sack Fachmedien erklären wir Ihnen in unserer Datenschutzerklärung.