Efficace Java 3rd Edition Chapitre 3 Méthodes communes à tous les objets

[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

Point 10 Lorsque vous remplacez les égaux, suivez le contrat général

La bonne façon de procéder consiste à ne pas remplacer si l'une des conditions suivantes est remplie:

La méthode equals implémente la relation d'équivalence et possède les propriétés suivantes:

--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;
    }

Élément 11 Toujours remplacer hashCode lors de la substitution égal à

contrat de méthode de hachage

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);
    }

Élément 12 Toujours remplacer toString

Point 13 Remplacer soigneusement le clone

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();
        }
    }

Point 14 Envisager de mettre en œuvre Comparable

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

Efficace Java 3rd Edition Chapitre 3 Méthodes communes à tous les objets
Méthodes efficaces du chapitre 8 de Java 3rd Edition
Efficacité de Java 3rd Edition Chapitre 5 Génériques
Effective Java 3rd Edition Chapitre 9 Programme Général
Enum et annotations du chapitre 6 de Java 3rd Edition efficace
Efficacité de Java 3rd Edition Chapitre 4 Classes et interfaces
Efficace Java 3e édition Chapitre 7 Lambda et Stream
Effective Java 3rd Edition Chapitre 2 Création et disparition d'objets
J'ai essayé d'expliquer Effective Java 3rd Edition "presque tous les chapitres" en "japonais facile à lire".
Efficace Java Chapitre 2
Effective Java Chapitre 6 34-35
Effective Java Chapitre 4 15-22
Java efficace Chapitre 3
3ème résumé efficace de Java
Efficacité de Java 3rd Edition Section 85 Choix d'une alternative à la sérialisation Java
Ce qui a changé entre la 2e édition effective de Java et la 3e édition
De Java inefficace à Java efficace
[Lire Java efficace] Chapitre 2 Item 5 "Eviter la création d'objets inutiles"
Comment utiliser les méthodes de classe [Java]
[Java efficace] Évitez de créer des objets inutiles
[Lire Java efficace] Chapitre 2 Item 1 "Considérez les méthodes de fabrique statiques plutôt que les constructeurs"
Convertir toutes les applications Android (Java) en Kotlin
[Lire Java efficace] Chapitre 2 Item 7 "Eviter les finaliseurs"
Méthode d'apprentissage inexpérimentée pour obtenir Java Silver 11