EffectiveJava(36) -- 坚持使用Override注解

来源:互联网 发布:易语言网络验证教程 编辑:程序博客网 时间:2024/05/16 09:25

@Override 注解: 表示被注解的方法声明覆盖了超类型中的一个声明
我们应该在想要覆盖超类声明的每个方法声明中使用 Override 注解 ; 现在的 IDE 都提供了代码检验功能 . 当一个 方法没有使用 Override 注解却覆盖了超类方法时 , IDE 就会产生警告
如 , 当我们想定义一个 Bigram 类表示一个双字母组或者有序的字母(不存相同的字母)时

    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> set = new HashSet<Bigram>();            for (int i = 0; i < 10; i++) {                for(char c = 'a';c<='z';c++){                    set.add(new Bigram(c,c));                    //System.out.println(set);                }            }            System.out.println("setSize = "+set.size());        }    }

你可能期待它输出 26 , 但实际上它输出的是 260 !
*为什么呢?*
这是因为 Bigram 意图覆盖 equals 和 hashCode , 但是实际上却是重载 . 如果要覆盖 Object.equals , 必须定义一个参数为 Object 类型的equals 的方法 , 但是 Bigram 的equals 方法的参数并不是 Object 类型 , 因为它只是从 Object 上继承了 equals . 而这个 equals 方法测试对象的统一性(如 == ) . 每个 Bigram 的备份中 , 都与其余的不同 , 因此 equals 认为他们不相等 . 如果你使用 @Override 注解了 equals 方法告诉编译器你想要覆盖它 , 那么你将会得到一条编译错误的提示 , 告诉你参数必须为 Object 类型 你需要将 equals 作如下改动:

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

这样你就会得到想要的运行结果(26)

总结:如果在你想要的每个方法声明中使用 Override 注解来覆盖超类声明 , 编译器可以替你防止大量错误 . 在具体的类中 , 不必标注你确信覆盖了抽象方法声明的方法(标注也可)

1 0
原创粉丝点击