【问题标题】:Why java annotations?为什么是java注解?
【发布时间】:2011-05-16 04:42:07
【问题描述】:

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

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

【问题讨论】:

  • 这是该库开发人员的设计问题。你是对的,编译时错误比运行时错误好。也许 java 编译器应该有一种方法来指定参数的注释?在此之前,标记界面会更好。
  • 现在有太多要求关闭问题...为什么人们不证明关闭问题的理由?
  • 向后兼容性是许多此类设计决策的原因。当他们只有 XML 文件时,他们可能不想修改 java 类。但是,现在他们无法在不破坏旧版本的情况下强制使用接口。使用注释,您可以使用此或 XML 文件。要拥有接口,您必须更改所有代码才能拥有它,即使是 XML 的用户。
  • 题外话:提到Java和XML让我想起了这个小宝石:reddit.com/r/programming/comments/eaqgk/…

标签: java annotations marker-interfaces


【解决方案1】:

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

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

注释也被认为侵入性较小,但这点是品味问题,值得商榷。

另见:

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      强制实体实施一些 无方法接口而不是使用 @注解。但这并不受欢迎 在框架设计师中,什么是 这个解决方案的缺点?

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

      【讨论】:

      • @coubeatczech 是的,但对于小额收益来说,这是一个巨大的代价。如果要使用注释编译错误,请使用 AspectJ。它允许您根据许多不同的切入点定义自定义编译器错误,包括注释(或缺少注释)
      • 您也可以使用注释处理器 (apt) 实现相同的功能
      【解决方案4】:

      引用java教程:

      注解提供关于一个 不属于 程序本身。他们没有直接 对代码运行的影响 他们注释。

      注解有多种用途, 其中:

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

      如您所见,注解是一种在 java 中指定类型元数据的方法,包括接口,它们绝不是它们的替代品。

      【讨论】:

        【解决方案5】:

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

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

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

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

        This tutorial explains how you can use java annotations to create you own test runner.

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-04-02
          • 1970-01-01
          • 2010-09-10
          • 2013-08-09
          • 2010-12-10
          相关资源
          最近更新 更多