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.
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
** 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).
Ü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 **
Finalizer-Angriff - Verwenden Sie den Finalizer, um das schädliche Objekt auf dem Heap zu belassen und die Methode aufzurufen (die Beschreibung selbst war ebenfalls in der 2. Ausgabe enthalten, wird jedoch stärker betont).
Sollte stattdessen "AutoCloseable" implementieren
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
Comparator.comparing ... ()
Item 15
Item 19
Item 20
** 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 **
synchronizedCollection
Die Standardmethode wird nicht synchronisiert (bis sie überschrieben wird)!Gelöscht, zusammengeführt in Punkt 42
Item 24
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.
"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.
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.
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.
Function :: identity
vs x-> x
)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.
Verwenden Sie die Standardschnittstelle, anstatt eine eigene Funktionsschnittstelle zu erstellen
Bei der Definition Ihrer eigenen Funktionsschnittstelle
Weit verbreitet und von beschreibenden Namen profitierend
Wenn Sie einen stark verwandten Vertrag haben
Wenn Sie von Ihrer eigenen Standardmethode profitieren
Verwenden Sie "@ FunctionalInterface"
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.
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.
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.
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.
** 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. ** ** **
Das Parallelisieren von Streams verlangsamt nicht nur die Leistung, sondern kann auch zu falschen Ergebnissen und unvorhersehbarem Verhalten führen.
Unterschied zwischen "forEach" und "forEachOrdered"
Grobe Anleitung: Die Leistung kann sich verbessern, wenn "Stream-Elemente x Codezeilen> 100.000" überschritten wird Quelle im Buch: Wann parallele Streams verwendet werden sollen
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
Objects.requireNonNull
Item 50
**
Datum
ist veraltet und sollte nicht mehr in neuem Code verwendet werden **
** 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. ** ** **
Verwenden Sie "OptionalInt", "OptionalLong", "OptionalDouble". Wenn es sich um "Optional
Verwenden Sie keine Optionen für Sammlungs- oder Array-Schlüssel, -Werte oder -Elemente
Das Speichern von Optionen in Feldern ist oft ein "Geruch" -Code, kann aber auch gerechtfertigt sein (z. B. wenn Sie viele optionale Felder haben und nur das optionale vom Getter zurückgeben müssen).
Item 56
Item 59
Löschen
Item 75
Der Stream wurde als Kandidat hinzugefügt.
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.
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