Java Fortgeschrittene

Die Schulung vertieft die Kenntnisse der Java-Programmierung bis zum aktuellen Sprachstand (Java OpenJDK LTS) und führt von der Sprache zur vollständigen Anwendung. Sie behandelt die Entwicklung der Plattform seit Java 5, das Typsystem und die tägliche Standardbibliothek, funktionale Programmierung mit Lambdas und Streams sowie Annotationen und Reflection als Fundament heutiger Frameworks. Darauf aufbauend entsteht eine lauffähige Anwendung: REST-Schnittstellen und Weboberfläche mit Quarkus, Persistenz mit JDBC und JPA, automatisierte Tests, Nebenläufigkeit von klassischen Threads bis zu virtual threads, Netzwerkprogrammierung sowie die Anbindung von Sprachmodellen. Die Themen werden an einem durchgehenden Beispiel erarbeitet und in Übungen selbst umgesetzt.

Trainer und Dozenten

Christian Kölker ist seit mehreren Jahren als Dozent für Schulungen in den Themengebieten Java, Struts und Datenbanken aktiv.
Die Programmiersprache Java setzt er seit 1999 in Projekten ein. Als Entwicklungsleiter der Firma [netzfactor] ist er verantwortlich für diverse Programme im Java Bereich.

Voraussetzungen

Diese Schulung richtet sich an Programmierer, die Grundkenntnisse der Programmiersprache Java und der objektorientierten Programmierung besitzen.
Diese können zum Beispiel durch die Schulung Java-Programmierung erworben worden sein.

Inhalt

Behandelt wurden die folgenden Themen:

Die Java-Plattform seit Version 5

  • Generische Datentypen, variable Argumentenlisten (Varargs), erweiterte for-Schleife
  • Auto-Boxing und Auto-Unboxing, Aufzählungen (Enumerations), statische Importe
  • Annotationen und die kleineren Spracherweiterungen aus Project Coin
  • Der heutige Sprachstand: var, Textblöcke, Records, sealed types, switch-Expressions und pattern matching

Objektorientierung vertieft

  • Überladen und Überschreiben, Sichtbarkeiten und Vererbung
  • Die Verträge von equals, hashCode und compareTo
  • Fehlerbilder, die aus der Verletzung dieser Verträge folgen

Generische Datentypen in der Praxis

  • Typparameter und generische Methoden
  • Wildcards und das PECS-Prinzip
  • Type erasure und ihre Grenzen

Collections, Datum und Zeit

  • Auswahl der passenden Datenstruktur, Sortierung und Ordnung, SequencedCollection
  • Datums- und Zeitrechnung mit java.time
  • Zeitzonen, Zeiträume und Formatierung

Fehlerbehandlung

  • Checked und unchecked Exceptions, try-with-resources
  • Optional statt null
  • Ergebnistypen als Alternative zur Ausnahme

Funktionale Programmierung und Stream API

  • Lambdas, Methodenreferenzen, funktionale Interfaces und Komposition
  • Streams von der Quelle über Zwischenoperationen bis zum Ergebnis
  • Collectors, Gruppierung und Auswertung

Annotationen und Reflection

  • Klassen der Reflection API, Klassen- und Instanzeigenschaften ermitteln
  • Dynamisches Erzeugen von Instanzen
  • Eigene Annotationen definieren und auswerten
  • Dynamische Proxies — und wie Frameworks damit arbeiten

Von der Klasse zur Anwendung

  • Maven: Lifecycle, Abhängigkeiten, Scopes, Versionsverwaltung über eine BOM
  • Logging mit SLF4J: Level, Platzhalter, strukturierter Kontext (als Nachfolger von java.util.logging und Log4j)
  • Dependency Injection mit CDI

Webanwendungen und REST mit Quarkus

  • Dev mode, Konfiguration und Profile
  • REST-Endpunkte und JSON-Bindung
  • Bean Validation und Fehlerabbildung

Datenbanken und Persistenz

  • JDBC: PreparedStatement, DataSource und Connection Pool, Transaktionen
  • JPA und Hibernate mit Panache: Entities und Mapping, Abfragen, Transaktionsgrenzen
  • Datenbank im Container über Dev Services

Automatisierte Tests

  • JUnit 5: Lebenszyklus, parametrisierte Tests, Ausführung in IDE und Build
  • Zusicherungen mit AssertJ
  • Testdoubles mit Mockito
  • Integrationstests mit @QuarkusTest

Nebenläufigkeit

  • Thread und Runnable, Synchronisation und Monitore
  • Sichtbare Zustände und Wettlaufsituationen
  • java.util.concurrent: ExecutorService, Future, CompletableFuture
  • Virtual threads (Java 21) und wann sie klassische Threadpools ersetzen

Netzwerkprogrammierung

  • Socket-Programmierung mit ServerSocket, ein Thread je Verbindung
  • HTTP-Aufrufe mit dem HttpClient als Nachfolger von URL und URLConnection

Oberfläche, Internationalisierung und Lokalisierung

  • Serverseitig gerenderte Oberfläche aus denselben Endpunkten wie das JSON
  • Die Klasse Locale, Auslagern von Bezeichnungen in ResourceBundle
  • Sprachwahl über Accept-Language
  • Formatierung von Zahlen, Währungen und Datumsangaben je Locale
  • Auslieferung als ausführbares Artefakt

Sprachmodelle in Java-Anwendungen

  • LangChain4j: AI services und strukturierte Antworten direkt in ein Record
  • Tools und function calling über annotierte Methoden
  • Ausblick auf Retrieval Augmented Generation

Kurszeiten

Wer möchte, reist bis 22 Uhr am Vortag an und nutzt den Abend bereits zum Fachsimpeln am Kamin oder im Park.

An Kurstagen gibt es bei uns ab 8 Uhr Frühstück.

Unsere Kurse beginnen um 9 Uhr und enden um 18 Uhr.

Neben den kleinen Pausen gibt es eine Stunde Mittagspause mit leckerem, frisch in unserer Küche zubereitetem Essen.

Nach der Schulung anschließend Abendessen und Angebote für Fachsimpeln, Ausflüge uvm. Wir schaffen eine Atmosphäre, in der Fachleute sich ungezwungen austauschen. Wer das nicht will, wird zu nichts gezwungen und findet auch jederzeit Ruhe.