【问题标题】:What is the purpose of annotations in Java?Java中注解的目的是什么?
【发布时间】:2013-12-04 19:05:48
【问题描述】:

我了解注释的目的是修改代码而不实际是代码,例如:

@Author(
   name = "Benjamin Franklin",
   date = "3/27/2003"
)

但我不明白如何使用注释比仅仅说 name = "Benjamin Franklin" 更好/更清晰/更简洁?注解的加入如何强化代码?

编辑: 对不起另一个问题,但我知道@Override 可以帮助防止/跟踪调用方法或类时的拼写错误,但它是如何做到的呢?它对实际程序有帮助吗?

【问题讨论】:

  • 编译器使用覆盖注解来确保您实际上是按照自己的想法编写代码。

标签: java annotations


【解决方案1】:

注解只是元数据。就他们自己而言,它们几乎没有任何用途。必须有一个注释处理器,无论是在编译器还是运行时级别,都可以将它们用于某些事情。

带有注释

@Author(
   name = "Benjamin Franklin",
   date = "3/27/2003"
)

例如,一些注释处理器可能会在运行时通过反射读取它并创建一些日志文件,该作者在该日期编写了它所注释的任何内容。

【讨论】:

    【解决方案2】:

    注解是元数据。 @Override 注释用于确保您正在覆盖超类的方法,而不仅仅是创建具有相同名称的方法。这里的常见错误包括:

    • 方法名称拼写错误 equal(Object o) 而不是 equals(Object o)
    • 设置不同的参数集

      MyString 扩展 String { public boolean equals(MyString str) {} }

    equals(MyString str) 没有覆盖方法equals(Object o),因此不会被标准Java 比较器使用(在一些标准函数中使用,例如List.contains(),这很容易出现错误情况)。 此注解有助于编译器确保您正确编码所有内容,从而有助于编程。

    @Deprecated 注释不会使程序无法编译,但它会使开发人员考虑使用可以和/或将在未来版本中删除的代码。所以他们(开发人员)会考虑转向另一组(更新的)功能。如果您使用标志 -Xlint 编译程序,编译过程将返回错误,除非您删除所有已弃用代码的用法或使用注释 @SuppressWarnings("deprecation") 显式标记它们。

    @SuppressWarnings 用于抑制警告(是的,我知道这是明显的船长风格:))。 @SuppressWarnings("deprecation") 有一个弃用抑制,@SuppressWarnings("unchecked") 和其他一些不安全类型转换。当您的项目编译器具有编译标志 -Xlint 而您不能(或不想)更改它时,这很有帮助。

    您还可以将注释处理器集成到程序构建过程中,以确保程序代码符合某种标准。例如,使用 IntelliJ Idea IDE 注释处理器,您可以使用 @Nullable@NotNull 注释。他们在使用您的代码时向其他程序员展示,以便可以将 null 作为某个参数传递给方法或不传递给方法。如果他们传输 null 会在编译期间或执行单行方法的代码之前导致异常。

    因此,如果您充分利用注释,它们会非常有帮助。

    【讨论】:

    • 可选注释(如@FunctionalInterface@SuppressWarnings("unchecked"))之间有什么区别,实际上系统会考虑并更新其标志?我以为注释是用来告诉用户这是什么,@Entity@Consumer@Configuration 等。系统不关心这些名称对吗?这些有术语吗?
    【解决方案3】:

    注释最有可能被其他程序使用。示例包括:

    @覆盖 IDE(编译器?)确保签名匹配

    @已弃用 IDE 标记出现,编译器警告

    @FXML 当 .fxml 文件膨胀时,JavaFX 可以使用这些注释初始化控制器类中的变量(请参阅http://docs.oracle.com/javafx/2/get_started/fxml_tutorial.htm)。 JavaFX Scene Builder 也使用它们。

    【讨论】:

      【解决方案4】:

      注释是一种标记代码的方式。有几个框架使用它,而其他一些则很好地利用它来生成您自己的。

      此外,重要的是要理解注释等同于元数据,但远不止于此,因为它可以作为代码的标记语言。

      【讨论】:

        【解决方案5】:

        Java @Annotation

        @Annotation(来自Java 5)添加了一个元数据,用于编译、部署和运行时的指令。它是由RetentionPolicy定义的

        RetentionPolicy 定义一个生命周期

        • RetentionPolicy.SOURCE:仅在编译时可见(@Override@SuppressWarnings@StringDef)。例如apt可以使用它来生成一些代码
        • RetentionPolicy.CLASS:在编译和部署时可见(.class)。例如,ASM 或 AspectJ 等 Java AOP 范例可以使用它
        • RetentionPolicy.RUNTIME:在部署和运行时可见。例如,它可以使用 java reflection 使用 getAnnotations()。 Dagger 2 使用 @Scope 注释

        创建自定义注释

        @Retention(<retention_policy>) //optional
        @Target(<element_type>) //optional to specify Java element like, field, method...
        @Inherited // optional will be visible by subclass 
        @Documented // optional will be visible by JavaDoc
        @interface MyAnnotation {
            //attributes:
            String someName();
        }
        

        使用

        @MyAnnotation(someName = "Alex")
        public class SomeClass {
        }
        

        【讨论】:

          猜你喜欢
          • 2013-05-16
          • 1970-01-01
          • 1970-01-01
          • 2011-05-16
          • 1970-01-01
          • 2018-05-09
          • 1970-01-01
          • 2013-08-09
          • 2017-09-16
          相关资源
          最近更新 更多