【问题标题】:java annotations - library or language feature?java注释-库或语言功能?
【发布时间】:2011-09-16 00:07:24
【问题描述】:

是否应该将 Java 注释视为一种语言或库功能。我不是指明显是一种语言特性的注解的概念,而是特定的注解,例如@Override 和@Deprecated?

似乎更清楚的是,仅由 3rd 方库支持的注释(例如 Hibernate 注释)显然不是 Java 语言的一部分,但对于内置注释我不太确定。

如果这被认为过于散漫,请随时转到programmers.stackexchange.com

【问题讨论】:

    标签: java annotations


    【解决方案1】:

    这是我的想法:

    boolean isLanguageFeature(foo)
    {
        return JLS.contains(foo)
    }
    

    JLS 描述了 Java编程语言。正如您清楚地理解的那样,注释的概念是一种语言 功能。另一方面,JLS 没有描述大量标准 Java 库功能,例如 Collections API。

    来自JLS §9.6.1, Predefined Annotation Types:

    Java 平台的库中预定义了几种注解类型。其中一些预定义的注释类型具有特殊的语义。这些语义在本节中指定。本节不提供此处包含的预定义注释的完整规范;这就是适当的 API 规范的作用。此处仅指定需要 Java 编译器或虚拟机方面的特殊行为的语义。

    按照这些思路思考,我会说 Java 注释是一个库特性。

    【讨论】:

      【解决方案2】:

      @Deprecated 和 @Override 之类的注解是语言工具发生用来强制和/或描述代码行为的库功能。绝对是库功能。

      【讨论】:

      • 我同意你的观点,但你实际上并没有提供任何支持性的论据。
      • 它们在标准 Java 库中。根据定义,它们是库功能。我想我觉得没有必要支持它。
      • 支持论点:@Override 可能是标准注释中最语言化的。但是,如果您编写了一个完全忽略此注释的替代 Java 编译器,则生成的代码的行为将与 javac 生成的代码完全相同。 (首先假设它是正确的。)注释可以改变代码行为的唯一方法是,如果库(如 Hibernate)使用字节码增强器处理它们。
      • @Override(库功能)不需要实际覆盖函数(语言功能)这一事实使其更像是一个(可选)库功能。省略 @Override 不会在运行时传达不同的行为,仅在编译时(额外检查)和 IDE 中(警告)。见stackoverflow.com/questions/4822954/…
      • @xdevs23 ...是的,我们就是这么说的。
      【解决方案3】:

      注释用于(在 Java 中)将元数据添加到您的代码中。注释是编写可读和可维护代码的方式。因此,要编写好的代码,请使用注释,因为它们是 Java 注释或任何其他第三方。

      例如想要使 EJB 无状态,现在只需添加 @Stateless 注释即可。

      【讨论】:

      • 我相信他的问题更多地与 Java 注释的性质有关,而不是它们是什么或何时应该使用它们。
      • 同意@tke。 OP 清楚地了解如何以及为什么使用注释。这个答案错过了问题,并且完全无法得出任何结论。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-01
      • 2011-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-20
      相关资源
      最近更新 更多