Effective Java | 3 |
Impressum | 4 |
Inhaltsverzeichnis | 5 |
Vorbemerkung | 11 |
Vorwort | 13 |
Danksagung | 14 |
Kapitel 1 - Einleitung | 15 |
Kapitel 2 - Objekte erzeugen und auflösen | 19 |
2.1 Thema 1: Statische Factory-Methoden als Alternative zu Konstruktoren | 19 |
2.2 Thema 2: Erwägen Sie bei zu vielen Konstruktorparametern den Einsatz eines Builders | 24 |
2.3 Thema 3: Erzwingen Sie die Singleton-Eigenschaft mit einem private-Konstruktor oder einem Aufzählungstyp | 32 |
2.4 Thema 4: Erzwingen Sie die Nicht-Instanziierbarkeit mit einem private-Konstruktor | 34 |
2.5 Thema 5: Arbeiten Sie mit Dependency Injection statt Ressourcen direkt einzubinden | 35 |
2.6 Thema 6: Vermeiden Sie die Erzeugung unnötiger Objekte | 37 |
2.7 Thema 7: Löschen Sie veraltete Objektreferenzen | 41 |
2.8 Thema 8: Vermeiden Sie Finalizer und Cleaner | 44 |
2.9 Thema 9: Verwenden Sie try-with-resources anstelle von try-finally | 49 |
Kapitel 3 - Methoden, die allen Objekten gemeinsam sind | 53 |
3.1 Thema 10: Halten Sie beim Überschreiben von equals den allgemeinen Vertrag ein | 53 |
3.2 Thema 11: Überschreiben Sie, wenn Sie equals überschreiben, immer auch hashCode | 66 |
3.3 Thema 12: Überschreiben Sie immer toString | 71 |
3.4 Thema 13: Vorsicht beim Überschreiben von clone | 74 |
3.5 Thema 14: Denken Sie darüber nach, Comparable zu implementieren | 83 |
Kapitel 4 - Klassen und Schnittstellen | 91 |
4.1 Thema 15: Minimieren Sie den Zugriff auf Klassen und Member | 91 |
4.2 Thema 16: Verwenden Sie in öffentlichen Klassen Accessor- Methoden und keine öffentlichen Felder | 96 |
4.3 Thema 17: Bevorzugen Sie unveränderliche Klassen | 98 |
4.4 Thema 18: Ziehen Sie Komposition der Vererbung vor | 106 |
4.5 Thema 19: Entwerfen und dokumentieren Sie für Vererbung oder verbieten Sie sie | 112 |
4.6 Thema 20: Geben Sie Schnittstellen den Vorzug vor abstrakten Klassen | 118 |
4.7 Thema 21: Entwerfen Sie Ihre Schnittstellen für die Nachwelt | 123 |
4.8 Thema 22: Verwenden Sie Schnittstellen nur zum Definieren von Typen | 126 |
4.9 Thema 23: Arbeiten Sie mit Klassenhierarchien statt mit Tag-Klassen | 128 |
4.10 Thema 24: Ziehen Sie statische Member-Klassen den nicht-statischen vor | 131 |
4.11 Thema 25: Beschränken Sie Quelltextdateien auf eine einzige Toplevel-Klasse | 135 |
Kapitel 5 - Java Generics | 137 |
5.1 Thema 26: Hände weg von Rohtypen | 137 |
5.2 Thema 27: Eliminieren Sie unchecked-Warnungen | 143 |
5.3 Thema 28: Verwenden Sie Listen statt Arrays | 145 |
5.4 Thema 29: Bevorzugen Sie generische Typen | 150 |
5.5 Thema 30: Bevorzugen Sie generische Methoden | 155 |
5.6 Thema 31: Eingeschränkte Wildcard-Typen machen Ihre APIs flexibler | 159 |
5.7 Thema 32: Vorsicht beim Kombinieren von Java Generics mit varargs-Methoden | 166 |
5.8 Thema 33: Nutzen Sie typsichere heterogene Container | 171 |
Kapitel 6 - Aufzählungen und Annotationen | 177 |
6.1 Thema 34: Verwenden Sie Aufzählungen statt int- Konstanten | 177 |
6.2 Thema 35: Verwenden Sie Instanzfelder statt Ordinalzahlen | 188 |
6.3 Thema 36: Verwenden Sie EnumSet statt Bitfelder | 189 |
6.4 Thema 37: Verwenden Sie EnumMap statt Ordinalzahlindizierung | 191 |
6.5 Thema 38: Emulieren Sie erweiterbare Enums mit Schnittstellen | 196 |
6.6 Thema 39: Ziehen Sie die Annotationen den Namensmustern vor | 200 |
6.7 Thema 40: Verwenden Sie konsequent die Annotation Override | 208 |
6.8 Thema 41: Definieren Sie Typen mit Markierungsschnittstellen | 211 |
Kapitel 7 - Lambdas und Streams | 215 |
7.1 Thema 42: Lambdas sind oft besser als anonyme Klassen | 215 |
7.2 Thema 43: Denken Sie an Methodenreferenzen als Alternative zu Lambdas | 219 |
7.3 Thema 44: Verwenden Sie nach Möglichkeit die funktionalen Schnittstellen aus dem Standard | 221 |
7.4 Thema 45: Setzen Sie Streams mit Bedacht ein | 226 |
7.5 Thema 46: Bevorzugen Sie in Streams Funktionen ohne Nebeneffekte | 234 |
7.6 Thema 47: Verwenden Sie als Rückgabewert eher Collection als Stream | 240 |
7.7 Thema 48: Seien Sie vorsichtig, wenn Sie Streams parallelisieren | 246 |
Kapitel 8 - Methoden | 251 |
8.1 Thema 49: Prüfen Sie Parameter auf Gültigkeit | 251 |
8.2 Thema 50: Erstellen Sie bei Bedarf defensive Kopien | 254 |
8.3 Thema 51: Entwerfen Sie Methodensignaturen sorgfältig | 259 |
8.4 Thema 52: Verwenden Sie Überladung mit Bedacht | 261 |
8.5 Thema 53: Verwenden Sie varargs mit Bedacht | 268 |
8.6 Thema 54: Geben Sie nicht null, sondern leere Sammlungen oder Arrays zurück | 270 |
8.7 Thema 55: Verwenden Sie den Rückgabetyp Optional mit Bedacht | 272 |
8.8 Thema 56: Schreiben Sie Doc-Kommentare für alle offengelegten API-Elemente | 277 |
Kapitel 9 - Allgemeine Programmierung | 285 |
9.1 Thema 57: Minimieren Sie den Gültigkeitsbereich lokaler Variablen | 285 |
9.2 Thema 58: Ziehen Sie for-each-Schleifen den traditionellen for-Schleifen vor | 288 |
9.3 Thema 59: Machen Sie sich mit den Bibliotheken vertraut und nutzen Sie sie | 291 |
9.4 Thema 60: Vermeiden Sie float und double, wenn genaue Antworten benötigt werden | 294 |
9.5 Thema 61: Ziehen Sie die elementaren Datentypen den Wrapper-Typen vor | 297 |
9.6 Thema 62: Vermeiden Sie Strings, wenn andere Typen besser geeignet sind | 300 |
9.7 Thema 63: Denken Sie an die Leistungseinbußen bei der String-Verkettung | 303 |
9.8 Thema 64: Referenzieren Sie Objekte über ihre Schnittstellen | 304 |
9.9 Thema 65: Ziehen Sie Schnittstellen der Java Reflection vor | 306 |
9.10 Thema 66: Vorsicht bei der Arbeit mit nativen Methoden | 309 |
9.11 Thema 67: Optimieren Sie mit Bedacht | 310 |
9.12 Thema 68: Halten Sie sich an die allgemein anerkannten Namenskonventionen | 314 |
Kapitel 10 - Ausnahmen | 319 |
10.1 Thema 69: Verwenden Sie Ausnahmen nur für Ausnahmebedingungen | 319 |
10.2 Thema 70: Verwenden Sie geprüfte Ausnahmen für behebbare Situationen und Laufzeitausnahmen für Programmierfehler | 322 |
10.3 Thema 71: Vermeiden Sie den unnötigen Einsatz von geprüften Ausnahmen | 324 |
10.4 Thema 72: Ziehen Sie Standardausnahmen vor | 326 |
10.5 Thema 73: Werfen Sie Ausnahmen passend zur Abstraktion | 328 |
10.6 Thema 74: Dokumentieren Sie alle Ausnahmen, die jede Methode auslöst | 331 |
10.7 Thema 75: Geben Sie in Detailnachrichten Fehlerinformationen an | 332 |
10.8 Thema 76: Streben Sie nach Fehleratomizität | 334 |
10.9 Thema 77: Ignorieren Sie Ausnahmen nicht | 336 |
Kapitel 11 - Nebenläufigkeit | 339 |
11.1 Thema 78: Synchronisieren Sie den Zugriff auf gemeinsam genutzte, veränderliche Daten | 339 |
11.2 Thema 79: Vermeiden Sie übermäßige Synchronisation | 344 |
11.3 Thema 80: Ziehen Sie Exekutoren, Aufgaben und Streams den Threads vor | 351 |
11.4 Thema 81: Ziehen Sie die Nebenläufigkeitsdienste den Methoden wait und notify vor | 353 |
11.5 Thema 82: Dokumentieren Sie die Thread-Sicherheit | 358 |
11.6 Thema 83: Verwenden Sie die späte Initialisierung mit Bedacht | 361 |
11.7 Thema 84: Verlassen Sie sich nicht auf den Thread-Planer | 365 |
Kapitel 12 - Serialisierung | 367 |
12.1 Thema 85: Verwenden Sie statt der Java-Serialisierung besser deren Alternativen | 367 |
12.2 Thema 86: Implementieren Sie Serializable mit großer Vorsicht | 371 |
12.3 Thema 87: Verwenden Sie möglichst eine eigene serialisierte Form | 375 |
12.4 Thema 88: Implementieren Sie readObject defensiv | 381 |
12.5 Thema 89: Ziehen Sie zur Instanzenkontrolle die Aufzählungstypen der Methode readResolve vor | 387 |
12.6 Thema 90: Verwenden Sie möglichst Serialisierungs-Proxys anstelle von serialisierten Instanzen | 391 |
Index | 395 |
Literatur | 407 |