[Effective Java 3rd Edition](https://www.amazon.co.jp/Effective-Java-%E7%AC%AC3%E7%89%88-%E3%], qui est un livre indispensable pour les utilisateurs Java intermédiaires et supérieurs. 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) a une version Kindle, donc je vais le résumer.
Précédent: Création et disparition d'objets en vigueur dans le chapitre 2 de Java 3rd Edition Suivant: Classes et interfaces efficaces du chapitre 4 de Java 3rd Edition
--Reflective: pour null, x.equals (x)
doit retourner true pour toute valeur de référence x.
--Contraste: x.equals (y)
doit retourner vrai seulement si y.equals (x)
retourne vrai pour toutes les valeurs de référence non nulles x et y. ..
--Transitional: pour toutes les valeurs de référence non nulles x, y, z, si x.equals (y)
et y.equals (z)
retournent true, alors x.equals ( z)
doit retourner true.
--Constant: Pour toute valeur de référence non nulle x, y, plusieurs appels à x.equals (y)
seront systématiquement mis à vrai si les informations utilisées dans la comparaison d'égaux n'ont pas changé. Doit renvoyer ou renvoyer systématiquement false.
--Pour toute valeur de référence x non nulle, x.equals (null)
doit renvoyer false.
[Good]Exemple de remplacement égal
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;
}
//[Bon exemple] Remplacer l'exemple d'égalité
@Override
public boolean equals(Object o) {
if (o == this) {
//Est-ce une référence à votre propre objet?
return true;
}
if (!(o instanceof PhoneNumber)) {
//Est-ce le bon type?
return false;
}
//Cast avec le bon type
PhoneNumber pn = (PhoneNumber) o;
//Correspond-il à chacun des plis significatifs?
return pn.lineNum == lineNum && pn.prefix == prefix && pn.areaCode == areaCode;
}
}
Méthode Equals générée automatiquement par IntelliJ
@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;
}
Exemple de remplacement de hashCode
//[Bon exemple] Exemple de remplacement de hashCode
@Override
public int hashCode() {
int result = Short.hashCode(areaCode);
result = 31 * result + Short.hashCode(prefix);
result = 31 * result + Short.hashCode(lineNum);
return result;
}
Méthode HashCode générée automatiquement par IntelliJ
@Override
public int hashCode() {
return Objects.hash(areaCode, prefix, lineNum);
}
Méthode de clonage d'une classe qui n'a pas de référence à un état mutable
//Mettre en œuvre clonable
public final class PhoneNumber implements Cloneable {
//réduction
@Override
public PhoneNumber clone() {
try {
return (PhoneNumber) super.clone();
} catch (CloneNotSupportedException e) {
throw new AssertionError(); //Ça ne peut pas arriver
}
}
Méthode de clonage d'une classe avec une référence à un état mutable
public class Stack implements Cloneable {
//réduction
@Override
public Stack clone() {
try {
Stack result = (Stack) super.clone();
//Clonez le tableau et placez-le dans une variable membre.
result.elements = elements.clone();
return result;
} catch (CloneNotSupportedException e) {
throw new AssertionError();
}
}
Comparable avec la méthode de construction du comparateur
public final class PhoneNumber implements Comparable<PhoneNumber> {
//réduction
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