17

我想问为什么这么多使用java注解...我知道它们替换了例如jpa中的xml配置,但是为什么要使用这种配置呢?考虑这段代码:

@Entity 
class Ent{
   // some fields
}
//... somewhere in the other file far far away
class NonEnt{
   // whatever here
}
现在,当我尝试将其置于持久性上下文中时,使用EntityManager'spersist 方法,尝试持久化NonEnt实例时出现运行时错误(最好是编译错误)。对我来说有一个明显的解决方案,强制实体实现一些无方法接口而不是使用@Annotations。但这在框架设计师中并不流行,这种解决方案的缺点是什么?
谢谢回答...

4

5 回答 5

11

与标记接口相比,注释具有一些优势:

  • 它们可以参数化
  • 它们的粒度更——您不仅可以将它们附加到类,还可以将它们附加到其他类元素(字段、方法、方法参数等)

注释也被认为是不那么具有侵入性的,但这一点是品味问题,值得商榷。

也可以看看:

于 2010-11-26T13:22:57.293 回答
5

与强制客户端实现接口或扩展类相比,使用注释的侵入性要小得多。

于 2010-11-26T13:22:17.790 回答
3

对我来说有明显的解决方案,

您所描述的称为“标记界面”,这是对界面概念的滥用。我怀疑你认为它显而易见的唯一原因是因为Serializable- 它只是因为当时没有注释而存在。

强制实体实现一些无方法接口而不是使用@Annotations。但这在框架设计师中并不流行,这种解决方案的缺点是什么?

它的优点是什么?注释的巨大优势是它们可以有参数,而且它们的粒度要细得多。标记接口仅在类级别工作。

于 2010-11-26T13:26:06.217 回答
3

引用java教程:

注释提供有关程序的数据,这些数据不属于程序本身。它们对它们注释的代码的操作没有直接影响。

注释有许多用途,其中包括:

  • 编译器信息——编译器可以使用注解来检测错误或抑制警告。
  • 编译器时和部署时处理——软件工具可以处理注释信息以生成代码、XML 文件等。
  • 运行时处理——一些注解可以在运行时检查。

正如你所看到的,注解是一种在 java 中指定关于你的类型的元数据的方式,包括接口,它们绝不是它们的替代品。

于 2010-11-26T13:31:05.710 回答
0

当您想向类、方法或实例变量添加一些附加信息时,Java 注释非常有用。有很多库大量使用这些注释。这些注释使代码保持简单易读,并具有在运行时对代码进行更改的能力。

例如,如果您使用了lombok库,它会在编译时创建 setter、getter 和构造函数,并为您节省代码行和时间。

当编译器执行代码时,lomok 会搜索所有标有@Setter 或@Getter 注解的字段,并在类中为该字段添加setter 和getter。

另一个例子是 Junit 测试运行器。junit 如何区分测试类中的普通辅助方法和测试。为了区分两者,它使用 @Test 注释。

本教程解释了如何使用 java 注释来创建自己的测试运行器。

于 2017-01-22T08:28:02.057 回答