[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
--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.
x.equals (null)
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;
}
--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);
}
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();
}
}
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