Log In
Or create an account -> 
Imperial Library
  • Home
  • About
  • News
  • Upload
  • Forum
  • Help
  • Login/SignUp

Index
Titelei Impressum Inhalt Vorwort 1 Einführung
1.1 Eine Sprache für viele Plattformen 1.2 Deshalb ist Kotlin so besonders 1.3 Darauf dürfen Sie sich freuen
Teil I: Konzeptioneller Aufbau von Computern und Software
2 Komponenten eines Computers
2.1 Beliebige Daten als binäre Zahlen 2.2 Wie Zahlen in Texte, Bilder und Animationen umgewandelt werden 2.3 Zahlen als ausführbarer Code
3 Zugriff auf den Speicher
3.1 Organisation des Speichers 3.2 Daten im Speicher und Datenverarbeitung im Prozessor 3.3 Heap und Stack 3.4 Programme als Code schreiben statt als Zahlenfolgen
4 Interpreter und Compiler
4.1 Virtuelle Maschinen, Bytecode und Maschinencode 4.2 Kotlin – eine Sprache, viele Plattformen
5 Syntax, Semantik und Pragmatik
5.1 Syntax 5.2 Semantik 5.3 Pragmatik
6 Eingabe – Verarbeitung – Ausgabe 7 Los geht’s
7.1 Integrierte Entwicklungsumgebung 7.2 Projekt anlegen
Teil II: Grundlagen des Programmierens
8 Anweisungen und Ausdrücke
8.1 Ausdrücke
8.1.1 Literale 8.1.2 Operationen 8.1.3 Variablen und Funktionsaufrufe
8.2 Evaluation von Ausdrücken
8.2.1 Evaluieren von Operatoren 8.2.2 Evaluieren von Funktionen 8.2.3 Evaluieren von Variablen
8.3 Zusammenspiel von Werten und Typen
8.3.1 Typprüfungen durch den Compiler 8.3.2 Typen als Bausteine
9 Basis-Datentypen
9.1 Numerics 9.2 Characters und Strings 9.3 Booleans 9.4 Arrays 9.5 Unit 9.6 Any 9.7 Nothing 9.8 Zusammenfassung
10 Variablen
10.1 Deklaration, Zuweisung und Verwendung 10.2 Praxisbeispiel
10.2.1 Relevante Informationen extrahieren 10.2.2 Das Problem im Code lösen 10.2.3 Zusammenfassung
11 Kontrollstrukturen
11.1 Fallunterscheidungen mit if
11.1.1 if-Anweisung 11.1.2 if-Ausdruck
11.2 Pattern-Matching mit when
11.2.1 Interpretieren von Werten 11.2.2 Typüberprüfungen 11.2.3 Überprüfen von Wertebereichen 11.2.4 Abbilden von langen if-else-Blöcken
11.3 Wiederholung von Code mit while-Schleifen
11.3.1 Zählen, wie oft etwas passiert 11.3.2 Gameloop
11.4 Iterieren über Datenstrukturen mit for-Schleifen
11.4.1 Iteration mit Arrays 11.4.2 Iteration mit Ranges 11.4.3 Geht das alles nicht auch mit einer while-Schleife?
11.5 Zusammenfassung
12 Funktionen
12.1 Top-Level- und Member-Functions 12.2 Funktionsaufrufe (Applikation) 12.3 Syntax 12.4 Funktionsdefinition (Deklaration) 12.5 Funktionen als Abstraktion 12.6 Scoping 12.7 Rekursive Funktionen
12.7.1 Endlose Rekursion 12.7.2 Terminierende Rekursion 12.7.3 Rekursion vs. Iteration 12.7.4 Von Iteration zur Rekursion
12.8 Shadowing von Variablen 12.9 Inline-Funktionen 12.10 Pure Funktionen und Funktionen mit Seiteneffekt
12.10.1 Das Schlechte an Seiteneffekten 12.10.2 Ohne kommen wir aber auch nicht aus 12.10.3 Was denn nun?
12.11 Die Ideen hinter Funktionaler Programmierung 12.12 Lambdas 12.13 Closures 12.14 Funktionen höherer Ordnung
12.14.1 Funktionen, die Funktionen als Parameter akzeptieren 12.14.2 Funktionen, die Funktionen zurückgeben
12.15 Zusammenfassung 12.16 Das war’s
Teil III: Objektorientierte Programmierung
13 Was sind Objekte? 14 Klassen
14.1 Eigene Klassen definieren 14.2 Konstruktoren
14.2.1 Aufgaben des Konstruktors 14.2.2 Primärer Konstruktor 14.2.3 Parameter im Konstruktor verwenden 14.2.4 Initialisierungsblöcke 14.2.5 Klassen ohne expliziten Konstruktor 14.2.6 Zusätzliche Eigenschaften festlegen 14.2.7 Klassen mit sekundären Konstruktoren 14.2.8 Default Arguments 14.2.9 Named Arguments
14.3 Funktionen und Methoden
14.3.1 Objekte als Parameter 14.3.2 Methoden: Funktionen auf Objekten ausführen 14.3.3 Von Funktionen zu Methoden
14.4 Datenkapselung
14.4.1 Setter und Getter 14.4.2 Berechnete Eigenschaften 14.4.3 Methoden in Eigenschaften umwandeln 14.4.4 Sichtbarkeitsmodifikatoren
14.5 Spezielle Klassen
14.5.1 Daten-Klassen 14.5.2 Enum-Klassen 14.5.3 Singuläre Objekte 14.5.4 Daten-Objekte
14.6 Verschachtelte Klassen
14.6.1 Statische Klassen 14.6.2 Innere Klassen 14.6.3 Lokale innere Klassen 14.6.4 Anonyme innere Objekte
14.7 Inline-Value-Klassen 14.8 Klassen und Objekte sind Abstraktionen 14.9 Zusammenfassung
15 Movie Maker – Ein Simulationsspiel
15.1 Überlegungen zur Klassenstruktur
15.1.1 Eigenschaften und Methoden von Movie 15.1.2 Eigenschaften und Methoden von Director 15.1.3 Eigenschaften und Methoden von Actor 15.1.4 Genre als Enum 15.1.5 Objektstruktur
15.2 Von der Skizze zum Programm
15.2.1 Movie-Maker-Projekt anlegen 15.2.2 Genre implementieren 15.2.3 Actor und Director implementieren 15.2.4 Erfahrungszuwachs bei Fertigstellung eines Films
15.3 Komplexe Objekte zusammensetzen
15.3.1 Skills als eine Einheit zusammenfassen 15.3.2 Begleit-Objekt für Skills 15.3.3 Objektkomposition und Objektaggregation 15.3.4 Zusammensetzung der Klasse Movie 15.3.5 Film produzieren 15.3.6 Ein Objekt für Spieldaten 15.3.7 Code zum Projekt
Teil IV: Vererbung und Polymorphie
16 Vererbung
16.1 Vererbungsbeziehung 16.2 Klassenhierarchien 16.3 Eigenschaften und Methoden vererben 16.4 Zusammenfassung
17 Polymorphie
17.1 Überschreiben von Methoden
17.1.1 Eine Methode unterschiedlich überschreiben 17.1.2 Dynamische Bindung 17.1.3 Überschreiben eigener Methoden 17.1.4 Überladen von Methoden
17.2 Typen und Klassen
17.2.1 Obertypen und Untertypen 17.2.2 Generalisierung und Spezialisierung 17.2.3 Typkompatibilität 17.2.4 Upcast und Downcast 17.2.5 Vorsicht bei der Typinferenz 17.2.6 Smart Casts
18 Abstrakte Klassen und Schnittstellen
18.1 Abstrakte Klassen 18.2 Schnittstellen
18.2.1 Schnittstellen definieren 18.2.2 Schnittstellen implementieren 18.2.3 Schnittstellen für polymorphes Verhalten 18.2.4 Standardverhalten für Interfaces 18.2.5 SAM-Interfaces 18.2.6 Mehrere Interfaces implementieren
18.3 Alles sind Typen 18.4 Zusammenfassung
Teil V: Robustheit
19 Nullfähigkeit
19.1 Nullfähige Typen
19.1.1 Typen nullfähig machen 19.1.2 Optional ist ein eigener Typ
19.2 Sicherer Zugriff auf nullfähige Typen
19.2.1 Überprüfen auf null 19.2.2 Safe Calls 19.2.3 Verkettung von Safe Calls
19.3 Nullfähige Typen auflösen
19.3.1 Überprüfen mit if-else 19.3.2 Der Elvis-Operator rockt 19.3.3 Erzwungenes Auflösen
20 Exceptions
20.1 Sowohl Konzept als auch eine Klasse 20.2 Beispiele für Exceptions
20.2.1 ArrayIndexOutOfBoundsException 20.2.2 ArithmeticException
20.3 Exceptions aus der Java-Bibliothek 20.4 Exceptions auffangen und behandeln
20.4.1 Schreiben in eine Datei 20.4.2 Metapher: Balancieren über ein Drahtseil
20.5 Exceptions werfen 20.6 Exceptions umwandeln
20.6.1 Von Exception zu Optional 20.6.2 Von Optional zu Exception 20.6.3 Exceptions vs. Optionals
20.7 Exceptions weiter werfen 20.8 Sinn und Zweck von Exceptions
21 Movie Maker als Konsolenspiel umsetzen
21.1 Die Gameloop 21.2 Einen neuen Film produzieren 21.3 Statistik anzeigen
22 Entwurfsmuster
22.1 Das Strategiemuster
22.1.1 Im Code verstreute Fallunterscheidungen mit when 22.1.2 Probleme des aktuellen Ansatzes 22.1.3 Unterschiedliche Strategien für die Ausgabe 22.1.4 Nutzen der Strategie
22.2 Das Dekorierermuster
22.2.1 Probleme des gewählten Ansatzes 22.2.2 Dekorierer für Komponenten 22.2.3 Umsetzung des Dekorierers 22.2.4 Nutzen des Dekorierers
22.3 Weitere Entwurfsmuster
23 Debugger
Teil VI: Datensammlungen und Collections
24 Überblick
24.1 Pair und Triple
24.1.1 Verwendung 24.1.2 Syntaktischer Zucker 24.1.3 Destructuring 24.1.4 Einsatzgebiete
24.2 Arrays
24.2.1 Direkter Datenzugriff 24.2.2 Arrays mit null-Referenzen 24.2.3 Arrays mit primitiven Daten 24.2.4 Arrays vs. Listen
24.3 Listen
24.3.1 Unveränderliche Listen 24.3.2 Veränderliche Listen 24.3.3 List und MutableList sind verwandte Schnittstellen
24.4 Sets
24.4.1 Sets verwenden 24.4.2 Mengen-Operationen
24.5 Maps
24.5.1 Maps erzeugen 24.5.2 Arbeiten mit Maps 24.5.3 Maps durchlaufen
25 Funktionen höherer Ordnung für Datensammlungen
25.1 Unterschiedliche Verarbeitung von Listen
25.1.1 Imperative Verarbeitung von Listen 25.1.2 Funktionale Verarbeitung von Listen 25.1.3 Funktionen als kombinierbare Arbeitsanleitungen 25.1.4 Aufbau von Funktionen höherer Ordnung am Beispiel von map
25.2 Hilfreiche Funktionen für Datensammlungen 25.3 Anwendungsbeispiele für Funktionen höherer Ordnung 25.4 Sequenzen
25.4.1 Eager Evaluation – viel zu fleißig 25.4.2 Lazy Evaluation – Daten bei Bedarf verarbeiten 25.4.3 Sequenzen verändern die Reihenfolge 25.4.4 Fleißig oder faul – was ist besser?
26 Invarianz, Kovarianz und Kontravarianz
26.1 Typsicherheit durch Typ-Parameter
26.1.1 Invarianz 26.1.2 Die Grenzen von Invarianz 26.1.3 Kovarianz 26.1.4 Kontravarianz
26.2 Invarianz, Kovarianz und Kontravarianz im Vergleich
27 Listen selbst implementieren
27.1 Was ist eine Liste?
27.1.1 Unterschiedliche Listen als konkrete Formen 27.1.2 Eine Schnittstelle für alle möglichen Listen 27.1.3 Typ-Parameter selbst definieren (Generics) 27.1.4 Verschiedene Implementierungen derselben Schnittstelle
27.2 Implementierung der SimpleList durch Delegation 27.3 Implementierung der SimpleList mit Arrays
27.3.1 Datenstruktur 27.3.2 Direkte Abbildung der Listen-Operationen auf ein Array 27.3.3 Listen-Operationen mit aufwendiger Laufzeit bei Arrays
28 Verkettete Listen
28.1 Basisstruktur der verketteten Liste 28.2 Implementierung der verketteten Liste 28.3 Umsetzung der Funktionen
28.3.1 Einfügen am Anfang einer verketteten Liste 28.3.2 Zugriff auf das erste Element der verketteten Liste 28.3.3 Zugriff auf das letzte Element der verketteten Liste 28.3.4 Allgemeines Schema zum Durchlaufen einer verketteten Liste 28.3.5 Elemente der verketteten Liste zählen 28.3.6 Zugriff auf das n-te Element 28.3.7 Die verbleibenden Methoden implementieren
28.4 Über alle Listenelemente iterieren
28.4.1 Die Schnittstelle Iterable 28.4.2 Iterator implementieren 28.4.3 Iterator verwenden 28.4.4 Interne Iteration
29 Testen und Optimieren
29.1 Korrektheit von Programmen 29.2 Testfälle in JUnit schreiben
29.2.1 Assertions 29.2.2 Implementierung der Liste testen
29.3 Teste zuerst 29.4 Klasseninvariante
29.4.1 Alternative Implementierung von size() für die verkettete Liste 29.4.2 Gewährleistung eines gültigen Zustands
30 Optimierung und Laufzeiteffizienz
30.1 Laufzeit empirisch ermitteln 30.2 Laufzeit theoretisch einschätzen 30.3 Die O-Notation 30.4 Praktische Beispiele für die O-Notation
31 Unveränderliche verkettete Liste
31.1 Datenstruktur für die unveränderliche Liste
31.1.1 Fallunterscheidung durch dynamische Bindung 31.1.2 Explizite Fallunterscheidung innerhalb der Funktion 31.1.3 Neue Listen erzeugen statt Liste verändern 31.1.4 Hilfsfunktionen über Companion-Objekt bereitstellen
31.2 Rekursive Implementierungen
31.2.1 map und fold als rekursive Implementierung 31.2.2 forEach und Endrekursion
Teil VII: Android
32 Android Studio
32.1 Erstellen eines Projekts 32.2 Aufbau von Android Studio 32.3 Funktionsweise einer Android-App
32.3.1 MainActivity 32.3.2 Context 32.3.3 Manifest und Gradle-Skripte
32.4 Projektstruktur einer Android-App 32.5 Theming 32.6 Preview
33 Jetpack Compose
33.1 Deklarative UI-Entwicklung 33.2 Composable-Functions 33.3 Layout 33.4 State-Management
33.4.1 MutableState 33.4.2 Die remember-Funktion 33.4.3 State-Hoisting
33.5 Modifier 33.6 App-Architektur
33.6.1 UI-Layer 33.6.2 Data-Layer 33.6.3 Unidirectional-Data-Flow 33.6.4 Lokaler State 33.6.5 Observable-Types
33.7 Composition und Recomposition
33.7.1 Composition-Phase 33.7.2 Layout-Phase 33.7.3 Drawing-Phase
33.8 Persistenz
34 Entwicklung der Movie-Maker-App
34.1 Setup 34.2 ViewModel und DataStore 34.3 Start-Screen
34.3.1 Scaffold 34.3.2 Budget-Screen 34.3.3 Top-Bar
34.4 Produce-Movie-Screen
34.4.1 TitleTextfield 34.4.2 Actor-Pager 34.4.3 Budget-Slider 34.4.4 State-Hoisting 34.4.5 Produce-Movie-Button
34.5 Movie-Produced-Screen 34.6 Movie-Production-Error-Screen 34.7 Navigation
Teil VIII: Nebenläufigkeit
35 Grundlagen
35.1 Threads
35.1.1 Nicht-determinierter Ablauf 35.1.2 Schwergewichtige Threads
35.2 Koroutinen (Coroutines)
35.2.1 Koroutine vs. Subroutine 35.2.2 Coroutines vs. Threads
35.3 Zusammenfassung der Konzepte
36 Coroutines verwenden
36.1 Nebenläufige Begrüßung
36.1.1 Koroutine im Global Scope starten 36.1.2 Mehrere Koroutinen nebenläufig starten 36.1.3 Künstliche Wartezeit einbauen mit sleep 36.1.4 Informationen über den aktuellen Thread
36.2 Blockieren und Unterbrechen
36.2.1 Mehrere Koroutinen innerhalb von runBlocking starten 36.2.2 Zusammenspiel von Threads
36.3 Arbeit auf Threads verteilen 36.4 Jobs 36.5 Nebenläufigkeit auf dem main-Thread
36.5.1 Zusammenspiel von blockierenden und unterbrechenden Abschnitten 36.5.2 Abwechselnde Ausführung
36.6 Strukturierte Nebenläufigkeit mit Coroutine Scopes 36.7 runBlocking fürmain 36.8 Suspending Functions
36.8.1 Unterbrechen und Fortsetzen – Behind the scenes 36.8.2 Eigene Suspending Functions schreiben 36.8.3 Async 36.8.4 Strukturierte Nebenläufigkeit mit Async 36.8.5 Auslagern langläufiger Berechnungen
36.9 Dispatcher
36.9.1 Dispatcher festlegen 36.9.2 Wichtige Dispatcher für Android
37 Wettlaufbedingungen
37.1 Beispiel: Bankkonto
37.1.1 Auftreten einer Wettlaufbedingung 37.1.2 Unplanbare Wechsel zwischen Threads
37.2 Vermeidung von Wettlaufbedingungen
37.2.1 Threadsichere Datenstrukturen 37.2.2 Thread-Confinement 37.2.3 Kritische Abschnitte
38 Deadlocks 39 Aktoren 40 Da geht noch mehr
40.1 Infix-Notation 40.2 Operatoren überladen 40.3 Scope-Funktionen
40.3.1 apply-Funktion 40.3.2 let-Funktion 40.3.3 also-Funktion 40.3.4 Unterschiede der Scope-Funktionen 40.3.5 with-Funktion
40.4 Extension Functions 40.5 Weitere Informationsquellen
  • ← Prev
  • Back
  • Next →
  • ← Prev
  • Back
  • Next →

Chief Librarian: Las Zenow <zenow@riseup.net>
Fork the source code from gitlab
.

This is a mirror of the Tor onion service:
http://kx5thpx2olielkihfyo4jgjqfb7zx7wxr3sd4xzt26ochei4m6f7tayd.onion