Java 个库中缺少 @Override
Missing @Override in Java Libraries
被认为是一种很好的做法
use @Override annotation on methods which are being overriden in
subclass.
但为什么同样不适用于 Java 库附带的 classes。例如字符串Class。它覆盖了 Object class 的方法,但不在这些方法上使用 @Override 注释。
这样做是为了保持与 Java 之前版本(例如 1.4 等)的向后兼容性
谢谢
这不仅仅是装饰性注释,它在生成文档时很有用,可以通过 Java IDE 提供提示,并明确说明何时重写方法。
从 runtime/standard 库实现者的角度来看,修改所有现有的 classes 只是为了添加一些装饰品是不值得的。
此外,关于一般注释的向后兼容性,考虑到注释是 .class
文件中存在的可选和扩展属性(当它们的保留策略是 CLASS
或 RUNTIME
Class
和 Method
可用 Runtime(In)VisibleAnnotations
,Parameter
可用 Runtime(In)VisibleParameterAnnotations
)以前的 JVM 版本会在 .class
第一次执行文件解析需要 Class。
但实际上,1.4 JVM class 解析器甚至不会到达那些 Annotation .class
属性位于结构内部的位置,因为当 JVM 注意到.class
版本高于支持的版本。
@override 注释用于提供一些额外的信息,主要是在生成文档时,也用于通知开发人员代码打算覆盖超类中的方法。
oracle 文档中提到了这一点。
@Override @Override annotation informs the compiler that the element
is meant to override an element declared in a superclass. Overriding
methods will be discussed in Interfaces and Inheritance.
// mark method as a superclass method // that has been
overridden @Override int overriddenMethod() { }
While it is not required to use this annotation when overriding a
method, it helps to prevent errors. If a method marked with @Override
fails to correctly override a method in one of its superclasses, the
compiler generates an error.
在 SO 本身中参考此 discussion。
在 API 中,它不会为用户(API)提供太多。然而,当你实现一个方法时,你 'intend' 确实覆盖了一个超级 class 的方法,很容易错过应该匹配的方法签名。
在这种情况下 @Override
comes to the rescue as at compile time, it will fail or give a warning when the override does not happen. Also many IDE's recognize the @Override
并为您提供足够的支持,以便在编译之前标记和纠正这些情况。
所以 @Override
实质上声明了您打算让此方法重写某些内容。 API 的用户不会关心你的意图,只要它有效。
其实真正的原因大概是这样的:@Override
注解的Retention设置为SOURCE
.这意味着 @Override
标志在编译成 class 文件时被丢弃。
@Target(value=METHOD)
@Retention(value=SOURCE)
public @interface Override
use @Override annotation on methods which are being overriden in subclass.
但为什么同样不适用于 Java 库附带的 classes。例如字符串Class。它覆盖了 Object class 的方法,但不在这些方法上使用 @Override 注释。
这样做是为了保持与 Java 之前版本(例如 1.4 等)的向后兼容性
谢谢
这不仅仅是装饰性注释,它在生成文档时很有用,可以通过 Java IDE 提供提示,并明确说明何时重写方法。
从 runtime/standard 库实现者的角度来看,修改所有现有的 classes 只是为了添加一些装饰品是不值得的。
此外,关于一般注释的向后兼容性,考虑到注释是 .class
文件中存在的可选和扩展属性(当它们的保留策略是 CLASS
或 RUNTIME
Class
和 Method
可用 Runtime(In)VisibleAnnotations
,Parameter
可用 Runtime(In)VisibleParameterAnnotations
)以前的 JVM 版本会在 .class
第一次执行文件解析需要 Class。
但实际上,1.4 JVM class 解析器甚至不会到达那些 Annotation .class
属性位于结构内部的位置,因为当 JVM 注意到.class
版本高于支持的版本。
@override 注释用于提供一些额外的信息,主要是在生成文档时,也用于通知开发人员代码打算覆盖超类中的方法。
oracle 文档中提到了这一点。
@Override @Override annotation informs the compiler that the element is meant to override an element declared in a superclass. Overriding methods will be discussed in Interfaces and Inheritance.
// mark method as a superclass method // that has been overridden @Override int overriddenMethod() { }
While it is not required to use this annotation when overriding a method, it helps to prevent errors. If a method marked with @Override fails to correctly override a method in one of its superclasses, the compiler generates an error.
在 SO 本身中参考此 discussion。
在 API 中,它不会为用户(API)提供太多。然而,当你实现一个方法时,你 'intend' 确实覆盖了一个超级 class 的方法,很容易错过应该匹配的方法签名。
在这种情况下 @Override
comes to the rescue as at compile time, it will fail or give a warning when the override does not happen. Also many IDE's recognize the @Override
并为您提供足够的支持,以便在编译之前标记和纠正这些情况。
所以 @Override
实质上声明了您打算让此方法重写某些内容。 API 的用户不会关心你的意图,只要它有效。
其实真正的原因大概是这样的:@Override
注解的Retention设置为SOURCE
.这意味着 @Override
标志在编译成 class 文件时被丢弃。
@Target(value=METHOD)
@Retention(value=SOURCE)
public @interface Override