Werkzeuge
- Testen mit JUnit
- Einführung in das Build-Management mit Maven
- Logging
Vertiefung: Vererbung, Abstrakte Klassen, Interfaces
- Komposition vor Vererbung: Warum Vererbung einschränkt
- Details zur statischen und Instanz-Initialisierung
- Private Konstruktoren, Factory-Methoden, Builder, Singleton
- Abstrakte Klasse versus Interface
- Schnittstellenerweiterungen seit Java 8
Details zu Generics und Datenstrukturen
- Typparameter, generische Klassen und generische Methoden
- Wildcards, Raw Type, Type Erasure
- Index-sequentielle, verkettete und gehashte Datenstrukturen
- Die Bedeutung von equals() und hashCode()
- Struktur der Collection-API: Interfaces, Klassen und Algorithmen
- Unveränderbare Datenstrukturen
- Verwendung von Optional
- Enumerations und Records
Funktionale Programmierung und das Stream-API
- Motivation, Syntax und Möglichkeiten von Lambda-Ausdrücken
- Funktionale Interfaces
- Methoden- und Konstruktor-Referenzen
- Streams und ihre Arbeitsweise: parallel versus sequentiell
- Stream-Erzeugung, Zwischenschritte und terminale Operationen
- Eigene Kollektoren und Aggregate
Reflection-API
- Class-Objekte
- Eigenschaften zur Laufzeit auslesen
- Objekte erzeugen und Methoden aufrufen
- Annotationen deklarieren und auswerten
- Dynamische Proxy-Generierung
Nebenläufiges Programmieren mit Threads
- Die Klasse Thread und das Interface Runnable
- Thread-Pools, Callable, Future bzw. CompletableFuture
- Synchronisation, Sperren, Deadlock-Vermeidung
- Datenstrukturen für die konkurrierende Nutzung
- Flow-API
- Virtuelle Threads (ab Java 21)