Java中注释的目的是什么?

时间:2013-12-04 19:05:48

标签: java annotations

我知道注释有助于修改代码而无需实际使用代码,例如:

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

但我不明白使用注释比仅仅说名字=“本杰明富兰克林”更好/更清晰/更简洁?添加注释如何加强代码?

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

5 个答案:

答案 0 :(得分:3)

注释只是元数据。他们自己很少或没有目的。必须有一个注释处理器,在编译器或运行时级别使用它们。

使用类似

的注释
@Author(
   name = "Benjamin Franklin",
   date = "3/27/2003"
)
例如,某些注释处理器可能会在运行时使用反射读取它,并创建一个日志文件,该作者在该日期编写了所有注释文件。

答案 1 :(得分:1)

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

  • 拼写方法名称错误 equal(Object o)代替equals(Object o)
  • 添加不同的参数集

    MyString extends 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,它将在编译期间或在执行单行方法的代码之前导致异常。

因此,如果您充分发挥它们的潜力,那么注释会非常有用。

答案 2 :(得分:0)

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

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

@Deprecated IDE标记出现,编译器警告

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

答案 3 :(得分:0)

注释用作标记代码的方法。有几个框架使用它,而另一些框架则很好地利用它来创建自己的框架。

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

答案 4 :(得分:0)

@Annotation(来自Java 5)添加元数据

RetentionPolicy定义生命周期

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