Effektive Java 3rd Edition Kapitel 3 Allen Objekten gemeinsame Methoden

[Effektive Java 3rd Edition](https://www.amazon.co.jp/Effective-Java-%E7%AC%AC3%E7%89%88-%E3%] 82% B8% E3% 83% A7% E3% 82% B7% E3% 83% A5% E3% 82% A2% E3% 83% BB% E3% 83% 96% E3% 83% AD% E3% 83% 83% E3% 82% AF-ebook / dp / B07RHX1K53) hat eine Kindle-Version, daher werde ich sie zusammenfassen.

Zurück: Effektive Java 3rd Edition, Kapitel 2, Erstellung und Verschwinden von Objekten Weiter: Effektive Java 3rd Edition, Kapitel 4, Klassen und Schnittstellen

Punkt 10 Befolgen Sie bei allgemeinen Überschreibungen den allgemeinen Vertrag

Der richtige Weg, dies zu tun, besteht darin, nicht zu überschreiben, wenn eine der folgenden Bedingungen erfüllt ist:

Die Methode equals implementiert die Äquivalenzbeziehung und hat die folgenden Eigenschaften:

--Reflective: Für null muss x.equals (x) für jeden Referenzwert x true zurückgeben. --Contrast: x.equals (y) darf nur dann true zurückgeben, wenn y.equals (x) für alle Nicht-Null-Referenzwerte x und y true zurückgibt. .. --Transitional: Für alle Nicht-Null-Referenzwerte x, y, z, wenn x.equals (y) und y.equals (z) true zurückgeben, dann x.equals ( z) muss true zurückgeben. --Konsistent: Für jeden Nicht-Null-Referenzwert x, y werden mehrere Aufrufe von "x.equals (y)" konsistent auf "true" gesetzt, wenn sich die im Gleichheitsvergleich verwendeten Informationen nicht geändert haben. Muss entweder false oder konsistent false zurückgeben.

[Good]Beispiel für gleiches Überschreiben



public final class PhoneNumber {
    private final short areaCode, prefix, lineNum;

    public PhoneNumber(int areaCode, int prefix, int lineNum) {
        this.areaCode = rangeCheck(areaCode, 999, "area code");
        this.prefix = rangeCheck(prefix, 999, "prefix");
        this.lineNum = rangeCheck(lineNum, 9999, "line num");
    }

    private static short rangeCheck(int val, int max, String arg) {
        if (val < 0 || val > max) {
            throw new IllegalArgumentException(arg + ": " + val);
        }
        return (short) val;
    }

    //[Gutes Beispiel] Beispiel für gleich überschreiben
    @Override
    public boolean equals(Object o) {
        if (o == this) {
            //Ist es ein Verweis auf Ihr eigenes Objekt?
            return true;
        }
        if (!(o instanceof PhoneNumber)) {
            //Ist es der richtige Typ?
            return false;
        }
        //Mit dem richtigen Typ besetzen
        PhoneNumber pn = (PhoneNumber) o;
        //Passt es zu jeder der sinnvollen Falten?
        return pn.lineNum == lineNum && pn.prefix == prefix && pn.areaCode == areaCode;
    }
}

Gleiche Methode, die automatisch von IntelliJ generiert wird


    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        PhoneNumber that = (PhoneNumber) o;
        return areaCode == that.areaCode &&
                prefix == that.prefix &&
                lineNum == that.lineNum;
    }

Punkt 11 Überschreiben Sie immer hashCode, wenn Sie equals überschreiben

Hash-Methode Vertrag

--Wenn die hashCode-Methode wiederholt für dasselbe Objekt aufgerufen wird, während die Anwendung ausgeführt wird, muss die hashCode-Methode immer denselben Wert zurückgeben, es sei denn, die Informationen des im gleichen Vergleich verwendeten Objekts ändern sich. Dieser Wert muss nicht für einen Lauf derselben Anwendung und einen anderen übereinstimmen. --Wenn die beiden Objekte nach der Methode equals (Obeject) gleich sind, muss der Aufruf der hashCode-Methode für jedes der beiden Objekte das gleiche ganzzahlige Ergebnis liefern. --Wenn die beiden Objekte nicht gleich der Methode equals (Object) sind, muss der Aufruf der hashCode-Methode für jedes der beiden Objekte keine unterschiedlichen ganzzahligen Ergebnisse liefern. Der Programmierer sollte sich jedoch bewusst sein, dass das Erzeugen unterschiedlicher ganzzahliger Ergebnisse für ungleiche Objekte die Leistung der Hash-Tabelle verbessern kann.

Beispiel für das Überschreiben von hashCode


    //[Gutes Beispiel] Beispiel für das Überschreiben von HashCode
    @Override
    public int hashCode() {
        int result = Short.hashCode(areaCode);
        result = 31 * result + Short.hashCode(prefix);
        result = 31 * result + Short.hashCode(lineNum);
        return result;
    }

--31 wird traditionell gewählt, weil es eine ungerade Primzahl ist und eine gute Leistung hat.

Von IntelliJ automatisch generierte HashCode-Methode


    @Override
    public int hashCode() {
        return Objects.hash(areaCode, prefix, lineNum);
    }

Punkt 12 Überschreiben Sie immer toString

Punkt 13 Klon vorsichtig überschreiben

Klonmethode einer Klasse, die keinen Verweis auf einen veränderlichen Zustand hat


//Implementieren Sie Cloneable
public final class PhoneNumber implements Cloneable {
//Kürzung
    @Override
    public PhoneNumber clone() {
        try {
            return (PhoneNumber) super.clone();
        } catch (CloneNotSupportedException e) {
            throw new AssertionError(); //Kann nicht passieren
        }
    }

Klonmethode einer Klasse mit einem Verweis auf einen veränderlichen Zustand


public class Stack implements Cloneable {
//Kürzung
    @Override
    public Stack clone() {
        try {
            Stack result = (Stack) super.clone();
            //Klonen Sie das Array und fügen Sie es in eine Mitgliedsvariable ein.
            result.elements = elements.clone();
            return result;
        } catch (CloneNotSupportedException e) {
            throw new AssertionError();
        }
    }

Punkt 14 Erwägen Sie die Implementierung von Comparable

Vergleichbar mit der Komparatorbauweise


public final class PhoneNumber implements Comparable<PhoneNumber> {
//Kürzung
    private static final Comparator<PhoneNumber> COMPARATOR =
            Comparator.comparingInt((PhoneNumber pn) -> pn.areaCode)
            .thenComparingInt(pn -> pn.prefix)
            .thenComparingInt(pn -> pn.lineNum);

    @Override
    public int compareTo(PhoneNumber pn) {
        return COMPARATOR.compare(this, pn);
    }

Recommended Posts

Effektive Java 3rd Edition Kapitel 3 Allen Objekten gemeinsame Methoden
Effektive Java 3rd Edition Kapitel 8 Methoden
Effektive Java 3rd Edition Kapitel 5 Generika
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
Effektive Java 3rd Edition Kapitel 2 Objekterstellung und Verschwindenlassen
Ich habe versucht, Effective Java 3rd Edition "fast alle Kapitel" in "leicht lesbarem Japanisch" zu erklären.
Effektives Java Kapitel 2
Effektives Java Kapitel 6 34-35
Effektives Java Kapitel 4 15-22
Effektives Java Kapitel 3
effektive Java 3. Zusammenfassung
Effektive Java 3rd Edition Abschnitt 85 Auswählen einer Alternative zur Java-Serialisierung
Was hat sich zwischen Effective Java 2nd Edition und 3rd Edition geändert?
Von ineffektivem Java zu effektivem Java
[Read Effective Java] Kapitel 2 Punkt 5 "Vermeiden Sie die Erstellung unnötiger Objekte"
Verwendung von Klassenmethoden [Java]
[Effektives Java] Vermeiden Sie das Erstellen unnötiger Objekte
[Read Effective Java] Kapitel 2 Punkt 1 "Betrachten Sie statische Factory-Methoden anstelle von Konstruktoren"
Konvertieren Sie alle Android-Apps (Java) in Kotlin
[Read Effective Java] Kapitel 2 Punkt 7 "Vermeiden Sie Finalizer"
Unerfahrene Lernmethode, um Java Silver 11 zu erhalten