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