第36条:坚持使用Override注解
@Override注解,这个注解只能用于方法中声明,它表示被注解的方法声明覆盖了超类型中的同名方法的一个声明。如果坚持使用,可以防止一大类的非法错误。
下面举例:
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 bigram) {
return bigram.first == first && bigram.second == second;
}
public int hashCode() {
return 31 * first + second;
}
public static void main(String[] args) {
Set<Bigram> bigrams = new HashSet<Bigram>();
for (int i = 0; i < 10; i++) {
for (char ch = 'a'; ch <= 'z'; ch++) {
bigrams.add(new Bigram(ch, ch));
}
}
System.out.println(bigrams.size());
}
}//260
代码中原本想要重写equals方法,可是却重载了equals方法。这样的话,在进行这行代码( e.equals(e2) )时,就调用了Object类的equals方法,而Object类的equals方法是比较对象同一性的,即( e==e2 )。
例子中这行代码:bigrams.add(new Bigram(ch, ch)); 每次添加都会new Bigram(ch,ch),每一个Object都不一样,自然循环多少次,就add多少Object了。
总而言之,应该在想要覆盖超类声明的每个方法声明中使用Override注解,这样当想要覆盖的方法没有被覆盖时,编译器能提示错误,大大减少方法覆盖失败的可能性。