【问题标题】:Missing @Override in Java LibrariesJava 库中缺少 @Override
【发布时间】:2015-05-05 08:57:35
【问题描述】:

这被认为是一种好习惯

对被覆盖的方法使用@Override注解 子类。

但为什么同样不适用于 Java 库附带的类。例如字符串类。它覆盖了 Object 类的方法,但没有在这些方法上使用 @Override 注释。

这样做是为了保持与以前的 Java 版本(例如 1.4 等)的向后兼容性吗?

谢谢

【问题讨论】:

  • 先生,我的这个问题与您何时使用 Java 的 Override 注释以及为什么?因为我需要问为什么 Java 库中不使用 Override
  • @Ankit 库在前,注解在后。他们可能没有研究生或实习生来检查整个库代码只是为了添加覆盖注释:P
  • @Ankit 你可能是对的 - 似乎完全不同 - 放弃声明。

标签: java inheritance annotations jvm


【解决方案1】:

在 API 中,它不会为(该 API 的)用户提供太多东西。但是,当您实现一个方法并且您“打算”确实覆盖超类的方法时,很容易错过应该匹配的方法签名。

在这种情况下,@Override 在编译时就派上用场了,当覆盖不发生时,它将失败或发出警告。此外,许多 IDE 识别 @Override 并为您提供足够的支持,以便在您编译之前标记和纠正这些情况。

所以@Override 实质上表明了您的意图,即此方法会覆盖某些内容。 API 的用户不会关心您的意图是什么,只要它有效。

其实,可能真正的原因是这样的:@Override注解的Retention被设置为SOURCE。这意味着@Override 标志在编译到类文件时会被丢弃。

@Target(value=METHOD)
 @Retention(value=SOURCE)
public @interface Override

【讨论】:

  • 感谢您的回答先生
【解决方案2】:

这不仅仅是一个装饰性注释,它在生成文档时很有用,通过 Java IDE 提供提示并明确说明何时重写方法。

从运行时/标准库实现者的角度来看,修改所有现有类只是为了添加一些装饰性的东西是不值得的。

此外,关于一般注释的向后兼容性,考虑到注释是存在于.class 文件中的可选和扩展属性(当它们的保留策略为CLASS 或RUNTIME 并且可用于Class 和@ 987654325@ as Runtime(In)VisibleAnnotations 和 Parameter as Runtime(In)VisibleParameterAnnotations) 以前版本的 JVM 将在第一次需要 Class 时执行 .class 文件解析期间简单地忽略该属性。

但实际上,1.4 JVM 类解析器甚至不会到达那些 Annotation .class 属性位于结构内部的地步,因为当 JVM 注意到 .class 版本大于支持一个。

【讨论】:

    【解决方案3】:

    @override 注释用于提供一些额外的信息,主要是在生成文档时以及通知开发人员代码打算覆盖超类中的方法。

    oracle 文档中提到了这一点。

    @Override @Override 注解通知编译器该元素 旨在覆盖在超类中声明的元素。覆盖 方法将在接口和继承中讨论。

    // 将方法标记为超类方法 // 已被 重写 @Override int overriddenMethod() { }

    虽然重写时不需要使用此注解 方法,它有助于防止错误。如果用@Override 标记的方法 未能正确覆盖其超类之一中的方法, 编译器产生错误。

    请参阅 SO 本身中的 discussion。

    【讨论】:

    • 感谢您的回答先生
    猜你喜欢
    • 2013-08-02
    • 1970-01-01
    • 2021-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多