使用Java的@Override
注释的最佳实践是什么,为什么?
用@Override
注释标记每个被覆盖的方法似乎是多余的。 是否有某些编程情况要求使用@Override
而另一些则永远不要使用@Override
?
#1楼
接口实现上的@Override是不一致的,因为在Java中没有“覆盖接口”之类的东西。
@Override在接口实现上是没有用的,因为在实践中它不会捕获编译无论如何都不会捕获的错误。 只有一种牵强附会的情况,实现者的重写实际上会做一些事情:如果您实现一个接口,并且该接口使用REMOVES方法,则将在编译时通知您应删除未使用的实现。 请注意,如果新版本的接口具有NEW或CHANGED方法,则显然您将获得编译错误,因为您没有实现新的东西。
在1.6中,绝对不应在接口实现程序上使用@Override,并且由于eclipse不幸地选择将注释自动插入为默认行为,因此,我们得到了很多混乱的源文件。 在阅读1.6代码时,您无法从@Override注释中看到某个方法是否实际上覆盖了超类中的方法或仅实现了一个接口。
在实际重写超类中的方法时使用@Override很好。
#2楼
要利用编译器检查的优势,您应该始终使用Override注释。 但是请不要忘记,当重写接口方法时,Java Compiler 1.5将不允许此注释。 您仅可以使用它来覆盖类方法(是否抽象)。
某些IDE(例如Eclipse)甚至配置了Java 1.6运行时或更高版本,它们仍然符合Java 1.5,并且不允许如上所述使用@override。 为了避免这种行为,您必须转到:项目属性-> Java编译器->选中“启用项目特定设置”->选择“编译器符合级别” = 6.0或更高。
如果基础是接口或类,我每次独立重写方法时都喜欢使用此批注。
这可以帮助您避免一些典型的错误,例如当您以为您要覆盖事件处理程序,然后什么也没看到时。 假设您要向某个UI组件添加事件侦听器:
someUIComponent.addMouseListener(new MouseAdapter(){
public void mouseEntered() {
...do something...
}
});
上面的代码可以编译并运行,但是如果将鼠标移到someUIComponent内,则“执行某些操作”代码将记录运行情况,因为实际上您没有覆盖基本方法mouseEntered(MouseEvent ev)
。 您只需创建一个新的无参数方法mouseEntered()
。 代替该代码,如果您使用@Override
批注,则会看到编译错误,而您并没有在浪费时间思考为什么事件处理程序未运行。
#3楼
- 仅用于方法声明。
- 指示带注释的方法声明将覆