Effective Java
Details
Kernkonzepte:
- Item-Format
-
Ein Katalog von ~90 kurzen, in sich geschlossenen "Items", jedes eine konkrete Best-Practice-Regel mit Begründung und Trade-offs
- Objekterzeugung
-
Statische Factory-Methoden statt Konstruktoren; das Builder-Pattern bei vielen Parametern; Singletons und Nicht-Instanziierbarkeit bewusst erzwingen
- Die allgemeinen Objekt-Verträge
-
Die Verträge von
equals/hashCode/compareTo/cloneeinhalten; bei Überschreiben vonequalsstetshashCodeüberschreiben;toStringkonsistent überschreiben - Klassen und Interfaces
-
Sichtbarkeit und Veränderlichkeit minimieren (unveränderliche Klassen bevorzugen); Komposition statt Vererbung; Interfaces gegenüber abstrakten Klassen bevorzugen; für Vererbung entwerfen und dokumentieren oder sie verbieten
- Generics
-
Unchecked-Warnungen beseitigen; Listen gegenüber Arrays und generische Typen/Methoden bevorzugen; beschränkte Wildcards nach der PECS-Regel (Producer-Extends, Consumer-Super) verwenden
- Enums und Annotationen
-
Enums statt
int-Konstanten verwenden;EnumMap/EnumSetnutzen; Annotationen gegenüber Namenskonventionen bevorzugen;@Overridekonsequent verwenden - Lambdas und Streams
-
Lambdas gegenüber anonymen Klassen und Methodenreferenzen gegenüber Lambdas bevorzugen; Streams mit Bedacht einsetzen und seiteneffektfreie Funktionen bevorzugen (Java-8-Features, ergänzt in der 3. Auflage)
- Methoden und Exceptions
-
Parameter auf Gültigkeit prüfen; Methodensignaturen sorgfältig entwerfen; Exceptions nur für Ausnahmesituationen verwenden; Standard-Exceptions bevorzugen; alle geworfenen Exceptions dokumentieren
- Ressourcen- und Nebenläufigkeits-Hygiene
-
try-with-resources gegenüber
try-finallybevorzugen; Executors und Tasks gegenüber Threads bevorzugen; Concurrency-Utilities gegenüberwait/notifybevorzugen; Thread-Sicherheit dokumentieren - Schlüsselvertreter
-
Joshua Bloch ("Effective Java", Addison-Wesley) — ehemaliger Sun-/Google-Ingenieur, der den Entwurf des Java Collections Framework und anderer Kern-APIs leitete
Wann zu verwenden:
-
Einarbeitung von Java-Entwicklern in idiomatisches, robustes API- und Klassendesign
-
Code-Review-Diskussionen auf Basis eines gemeinsamen, zitierbaren Regelsatzes ("Item 17: minimize mutability")
-
Etablierung teamweiter Java-Coding-Standards und Design-Konventionen
-
Erklärung Java-spezifischer Verträge (
equals/hashCode, Generics, PECS) und ihrer Fallstricke -
Aufforderung an ein LLM, idiomatischen, robusten Java-Code zu erzeugen
Verwandte Anker:
Aktueller Status:
-
Die 3. Auflage (Addison-Wesley, erschienen im Dezember 2017, häufig als 2018 zitiert) ist die aktuelle Auflage. Sie ergänzte Items für Java-7-9-Features — Lambdas, Streams, das
java.time-Paket und try-with-resources -
Da sie dem Sechs-Monats-Release-Zyklus von Java vorausgeht, gibt es zu einigen Items inzwischen neuere Sprachalternativen: Records (Java 16) ersetzen viel handgeschriebenen Boilerplate für unveränderliche Klassen und Builder; Sealed Classes (Java 17) und Pattern Matching für
switch(Java 21) lösen einen Teil der Vererbungs- undinstanceof-Empfehlungen ab; Virtual Threads (Java 21) verändern die Abwägung "Executors statt Threads bevorzugen" -
Die Designprinzipien des Buches (Unveränderlichkeit bevorzugen, Komposition statt Vererbung, die Objekt-Verträge, PECS) bleiben gültig; nur die Mechanik einiger Items hat sich verschoben. Ein auf "Effective Java" geprägter Trainingsdaten-Prior spiegelt am ehesten die 3. Auflage wider und schweigt daher zu Records, Sealed Classes und Virtual Threads