Aktualisierungen von Effective Java Third Edition 2nd Edition Persönliche Notizen

Die von mir bestellte * Effective Java Third Edition * ist endlich eingetroffen, daher habe ich die Änderungen gegenüber der zweiten Edition zusammengefasst. Ich habe die persönlichen Notizen und die Teile übersprungen, die sich nicht von der zweiten Ausgabe unterscheiden. Bitte verzeihen Sie mir etwaige Auslassungen. Da sich die zweite Ausgabe auf die japanische Version bezieht, kann es zu Inkonsistenzen in Bezug auf den übersetzten Text kommen. Ich wäre Ihnen dankbar, wenn Sie auf Fehler hinweisen könnten.

Gebrauchsanweisung

Zitat aus Effective Java Third Edition oder dessen Übersetzung

Klartext - Individueller Eindruck


Item 2

Der Builder wurde mit rekursiven Parametern hinzugefügt. Sie können Unterklassen fließend entwerfen, indem Sie den von der übergeordneten abstrakten Klasse "Pizza" zurückgegebenen Builder auf "Builder <T erweitert Builder >" und den von der Methode "addTopping ()" auf "T" zurückgegebenen Typ setzen. ..

Punkt 5: Verwenden Sie die Abhängigkeitsinjektion anstelle von Hardcode-Ressourcen

** Statische Dienstprogrammklassen und Singletons sind nicht für Klassen geeignet, deren Verhalten durch Ressourcen parametrisiert werden kann **

Item 6

Das Beispiel für das Erstellen unnötiger Objekte wurde von "Kalender" in "String.matches ()" geändert (das Problem besteht darin, dass jedes Mal "Muster" erstellt wird).

Punkt 8: Vermeiden Sie Finalisierer und Reiniger

Über den in Java 9 hinzugefügten Reiniger wurde gesprochen.

** Reiniger sind nicht so gefährlich wie Finalisierer, aber sie sind immer noch unvorhersehbar, langsam und im Allgemeinen unnötig **

Punkt 9: Verwenden Sie Try-with-Resources, anstatt Try-finally

Item 10

Persönlich mag ich AutoValue nicht sehr, deshalb benutze ich Lombok oder schreibe es in Kotlin.

IDEs do not make careless mistakes, and humans do IDEs machen keine versehentlichen Fehler, aber Menschen

Item 11

Das Codebeispiel wurde geändert, um "Type.hashCode ()" (z. B. "Short.hashCode ()") zum Generieren des Hash-Codes zu verwenden. In Bezug auf die Dokumentation zum Generieren von hashCode ist der Ausdruck von "nicht tun" auf "nicht tun" stärker geworden (die Dokumentation macht es unmöglich, in Zukunft Änderungen vorzunehmen).

Item 12

Item 13

Item 14

Item 15

Item 19

Item 20

Punkt 21: Entwerfen Sie die Schnittstelle für die Zukunft

** Es ist nicht immer möglich, eine Standardmethode zu schreiben, ohne alle möglichen Implementierungen zu ändern ** ** Es ist nach wie vor von größter Wichtigkeit, beim Entwerfen einer Schnittstelle große Sorgfalt walten zu lassen **

Alter Artikel 21

Gelöscht, zusammengeführt in Punkt 42

Item 24

Punkt 25: Schreiben Sie nur eine Klasse der obersten Ebene in die Quelldatei

Sie können mehrere öffentliche Klassen in einer Sprache wie Kotlin schreiben, aber ich denke, es ist besser, sie aus Gründen der Lesbarkeit so weit wie möglich voneinander zu trennen.

Punkt 26: Verwenden Sie keinen Prototyp

"Mit neuem Code" ist weg (nicht zwangsweise überarbeitet)

Item 27:

Beschreibung des Diamantoperators

Item 30

Mit dem Hinzufügen des Diamantoperators ist die Beschreibung der Dienstprogrammmethode "newHashMap" zum Weglassen von Typparametern beim Erstellen einer neuen Sammlung verschwunden.

generic singleton pattern

private static UnaryOperator<Object> IDENTITY_FN = (t) -> t;
@SuppressWarnings("unchecked")
public static <T> UnaryOperator<T> identityFunction() {
    return (UnaryOperator<T>) IDENTITY_FN;
}

Ich glaube nicht, dass ich viele Möglichkeiten habe, es in tatsächlichen Schlachten einzusetzen.

Punkt 32: Kombinieren Sie generische Typen und Argumente variabler Länge sorgfältig

Item 34

Von String in Enum konvertieren

private static final Map<String, Operation> stringToEnum = Stream.of(values()).collect(toMap(Object::toString, e -> e));
public static Optional<Operation> fromString(String symbol) {
    return Optional.ofNufllable(stringToEnum.get(symbol));
}

Ich persönlich möchte eine Ausnahme auslösen (siehe Punkt 55).

Der "Payroll Day" wurde subtil überarbeitet.

Item 37

Warum haben Sie Herb in Plant und Type in Lifecycle geändert?

Item 39

JUnit -> JUnit 3 JUnit 4 basiert auf Anmerkungen, daher folge ich genau den Ratschlägen in diesem Abschnitt.

Punkt 42: Verwenden Sie Lambda anstelle einer anonymen Klasse

Lambda-Parametertypen werden nur verwendet, wenn das Programm dadurch sauberer wird. Lambda fehlen Name und Dokumentation. Verwenden Sie keine Lambdas, wenn der Vorgang nicht selbsterklärend oder größer als einige Zeilen ist.

Punkt 43: Verwenden Sie Methodenreferenzen anstelle von Lambda

Punkt 44: Verwenden Sie die Standardfunktionsschnittstelle

Das Muster "Vorlagenmethode", bei dem Unterklassen "primitive Methoden" überschreiben, um das Verhalten von Oberklassen anzupassen, ist viel weniger attraktiv. Eine moderne Alternative besteht darin, eine statische Factory oder einen statischen Konstruktor bereitzustellen, der Funktionsobjekte akzeptiert, die dasselbe tun.

Erstellen Sie keine unterschiedlichen überladenen Methoden mit unterschiedlichen Funktionsschnittstellen an derselben Position wie Argumente, wenn diese für den Client nicht eindeutig sein können.

Punkt 45: Verwenden Sie Streams mit Vorsicht

just because you can doesn't mean you should

** Übermäßiger Gebrauch von Streams macht das Programm schwer lesbar und wartbar **

Ich habe Ohrenschmerzen

** Die Verwendung von Hilfsmethoden in Code, der Stream-Pipelines verwendet, ist noch wichtiger als in Code, der Iteratoren verwendet. ** ** **

Der Methodenname (primes) ist eine Pluralnomenklatur, die die Elemente des Streams beschreibt. Diese Namenskonvention verbessert die Lesbarkeit der Stream-Pipeline und wird für alle Methoden, die einen Stream zurückgeben, dringend empfohlen.

Punkt 46: Verwenden Sie eine Funktion ohne Nebenwirkungen im Stream

Die Anweisung "forEach" sollte nur verwendet werden, um die Verarbeitungsergebnisse eines Streams zu melden, und keine Verarbeitung.

Es ist leicht, "forEach (e-> list.add (e))" zu sagen.

Punkt 47: Verwenden Sie die Sammlung anstelle des Streams für den Rückgabewert

Wenn Sie eine öffentliche API schreiben, die eine Sequenz zurückgibt, sollten Sie diese nicht nur für diejenigen schreiben, die Stream-Pipelines schreiben möchten, sondern auch für diejenigen, die für jede Anweisung schreiben möchten.

** Speichern Sie keine großen Sequenzen im Speicher, nur um sie als Sammlung zurückzugeben. ** ** **

Erwägen Sie die Implementierung einer Sammlung für einen bestimmten Zweck.

Punkt 48: Streams sorgfältig parallelisieren

** Wenn die Quelle "Stream.iterate" ist oder das Grenzwert "Zwischenoperation" verwendet wird, verbessert die Parallelisierung der Pipeline die Leistung nicht. ** ** **

** Das Parallelisieren von Streams von "ArrayList" -, "HashMap" -, "HashSet" -, "ConcurrentHashMap" -Instanzen, Arrays, "Int" -Bereich und "Long" -Bereich ist der größte Leistungsgewinn. Machen wir das. ** ** **

Es ist wichtig zu beachten, dass die Stream-Parallelisierung eine Leistungsoptimierung darstellt. Wie bei jeder Optimierung müssen Sie die Leistung vor und nach der Änderung messen, um sicherzustellen, dass Sie dies tun müssen.

Item 49

Item 50

** Datum ist veraltet und sollte nicht mehr in neuem Code verwendet werden **

Punkt 55: Vorsichtig optional zurücksenden

** Containertypen und Optionen wie Karten, Streams und Arrays dürfen nicht optional verpackt werden. Deklarieren Sie eine Methode zur Rückgabe von "Optional ", wenn möglicherweise keine Ergebnisse * und * zurückgegeben werden und der Client etwas Besonderes tun muss. ** ** **

Item 56

Item 59

Altes Element 73: Vermeiden Sie Thread-Gruppen

Löschen

Item 75

Punkt 80: Wählen Sie Executor, Task und Stream aus dem Thread aus

Der Stream wurde als Kandidat hinzugefügt.

Punkt 85: Verwenden Sie Alternativen anstelle der Java-Serialisierung

Die Gefahr der Serialisierung wird stark betont.

** Der beste Weg, um Serialisierungsschwachstellen zu vermeiden, besteht darin, nichts zu deserialisieren ** ** Es gibt keinen Grund, die Java-Serialisierung auf neu geschriebenen Systemen zu verwenden **

Das nächstbeste ist, ** niemals nicht vertrauenswürdige Daten zu deserialisieren **

Zusammenfassend ist die Serialisierung gefährlich und sollte nicht verwendet werden.

Impressionen

Bonus-Mr. Brocks PC

Alt Neu
AMD Opteron 170 Core i7-4770K
2GB RAM DDR3-1866 16GB RAM
Windows XP Windows 7 Professional SP1
JDK 1.6 Java HotSpot Azul Zulu 9.0.0.15

Recommended Posts

Aktualisierungen von Effective Java Third Edition 2nd Edition Persönliche Notizen
Effektive Zusammenfassung der Umfrage zu Java 2nd Edition
Persönliche Kommentarkriterien [Java Edition]
Von ineffektivem Java zu effektivem Java
Was hat sich zwischen Effective Java 2nd Edition und 3rd Edition geändert?
Effektive Java 3rd Edition Kapitel 8 Methoden
Effektives Java 3rd Edition Kapitel 9 Programm Allgemein
Effektive Java 3rd Edition Kapitel 6 Aufzählung und Anmerkungen
Effektive Java 3rd Edition Kapitel 4 Klassen und Schnittstellen
Effektive Java 3rd Edition Kapitel 7 Lambda und Stream