Effective Java: (40) Consistently use the Override annotation

Item 40: Consistently use the Override annotation

一句话总结:总是使用Override注解,如果你的方法重写了父类的一样方法声明。除非,父类中对应的方法声明为抽象方法。即使如此,添加上Override也没什么损失。

否则,下例中的错误我一开始也忽略了——

// 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());
    }
}

实际上,需要重新的equals方法的参数必须为Object对象equals(Object object),上面的例子传递的参数是当前对象,所以equals方法并没有被重写。如果添加了Override的声明,编译期会检查出对应的错误。

当重新父类的方法时,许多编译期目前支持自动插入Override注解。如果没有添加此注解,还可以进行告警。

此注解支持针对接口或类中的方法。加入接口没有默认的方法,可以忽略使用此注解(此时应该也没有方法可以写这个注解吧?)

例如Set接口尽管扩展了Collection接口——public interface Set<E> extends Collection<E>,但没有添加任何新的接口。这种情况下,应该给所有的方法声明都添加上Override注解。

© 版权声明

相关文章

暂无评论

none
暂无评论...