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<Bigram>();
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());
}
}
这方面的智慧似乎正在改变。今天我安装了IntelliJ IDEA 9,并注意到它的“缺失@覆盖检查”现在不仅捕获实现的抽象方法,而且还捕获实现的接口方法。在我雇主的代码库和我自己的项目中,我一直习惯只对前者使用@Override——实现的抽象方法。但是,重新考虑这个习惯,在这两种情况下使用注释的优点就变得很明显了。尽管比较冗长,但它确实可以防止脆弱基类问题(不像c++相关的例子那样严重),其中接口方法名称发生变化,将可能实现的方法孤立在派生类中。