[JAVA] Élément 40: utiliser systématiquement l'annotation de remplacement

40. Utiliser systématiquement les annotations de remplacement

La bibliothèque Java fournit quelques annotations, mais pour de nombreux programmeurs, @ Override '' est probablement le plus important. Si vous utilisez @ Override '' de manière cohérente, les bogues sont moins susceptibles de se produire. Prenons une classe qui imite le [bigram] suivant (https://www.weblio.jp/content/bigram) comme exemple (avec des bogues).

package tryAny.effectiveJava;

import java.util.HashSet;
import java.util.Set;

//Can you spot the bug?
public class Bigram {
    private final char first;
    private final char second;

    public Bigram(char first, char second) {
        this.first = first;
        this.second = second;
    }

    public boolean equals(Bigram b) {
        return b.first == first && b.second == second;
    }

    public int hashCode() {
        return 31 * first + second;
    }

    public static void main(String[] args) {
        Set<Bigram> s = new HashSet<>();
        for (int i = 0; i < 10; i++)
            for (char ch = 'a'; ch <= 'z'; ch++)
                s.add(new Bigram(ch, ch));
        System.out.println(s.size());
    }
}

Je pense que ce programme produit 26, mais il en produit 260. La cause est que j'ai l'intention de remplacer les égaux mais que je l'ai surchargé. L'argument de Object.equals est de type Object et a une signature différente. Pour éviter de telles erreurs, ajoutez `` @ Override '' à la méthode à remplacer. Ensuite, le code suivant entraînera une erreur de compilation.

@Override public boolean equals(Bigram b) {
    return b.first == first && b.second == second;
}

Cela devrait être comme suit.

@Override
public boolean equals(Object o) {
    if (!(o instanceof Bigram))
        return false;
    Bigram b = (Bigram) o;
    return b.first == first && b.second == second;
}

Pour cette raison, ** vous devez ajouter @Override lors du remplacement d'une méthode de la classe parente **. Il y a une exception à cela. Dans une classe concrète, lors de la substitution d'une méthode abstraite parente, une erreur de compilation se produira à moins qu'elle ne soit remplacée en premier lieu, il n'est donc pas nécessaire d'écrire `` @ Override '' (description). Aucun dommage causé par).

Recommended Posts

Élément 40: utiliser systématiquement l'annotation de remplacement
Point 59: Connaître et utiliser les bibliothèques
Point 44: Favoriser l'utilisation d'interfaces fonctionnelles standards
Item 52: Utiliser la surcharge judicieusement
Point 53: Utilisez judicieusement les varargs
Point 45: Utilisez judicieusement les flux
Point 83: Utilisez judicieusement l'initialisation paresseuse
Point 66: Utiliser judicieusement les méthodes natives
Point 26: N'utilisez pas de types bruts
Pourquoi vous devriez ajouter l'annotation Override lors du remplacement d'une méthode