Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么是java注释?_Java_Annotations_Marker Interfaces - Fatal编程技术网

为什么是java注释?

为什么是java注释?,java,annotations,marker-interfaces,Java,Annotations,Marker Interfaces,我想问一下为什么java注释被如此频繁地使用。。。我知道它们在例如jpa中取代了xml配置,但为什么要使用这种配置呢? 考虑一下这段代码: @Entity class Ent{ // some fields } //... somewhere in the other file far far away class NonEnt{ // whatever here } 现在,当我尝试将其放在持久化上下文中时,使用EntityManager的持久化方法,我会在尝试持久化NonEnt

我想问一下为什么java注释被如此频繁地使用。。。我知道它们在例如jpa中取代了xml配置,但为什么要使用这种配置呢? 考虑一下这段代码:
@Entity 
class Ent{
   // some fields
}
//... somewhere in the other file far far away
class NonEnt{
   // whatever here
}
现在,当我尝试将其放在持久化上下文中时,使用
EntityManager
的持久化方法,我会在尝试持久化
NonEnt
实例时得到运行时错误(最好是得到编译错误)。对我来说,有一个显而易见的解决方案,强制实体实现一些无方法接口,而不是使用@annotation。但这在框架设计师中并不流行,这种解决方案的缺点是什么?

感谢您回答…

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

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

  • 它们可以参数化
  • 它们更细粒度-您不仅可以将它们附加到类,还可以附加到其他类元素(字段、方法、方法参数等)
注释也被认为是较少干扰的,但这一点是有品味和争议的

另见:

  • (官方JDK文档)
对我来说,有明显的解决办法

您所描述的被称为“标记接口”,这是对接口概念的滥用。我怀疑你认为它显而易见的唯一原因是因为<代码>可序列化的< /C> >,这是因为当时没有注释。 强制实体实现一些 没有方法接口而不是使用 @注释。但这并不流行 在框架设计器中,什么是 这种解决方案的缺点是什么


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

引用java教程:

注释提供了有关 不属于项目的程序 程序本身。他们没有直接联系 对守则运作的影响 他们注释

注释有很多用途, 其中:

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

正如您所见,注释是一种在java中指定有关类型(包括接口)的元数据的方法,它们绝不能替代它们。

当您想向类、方法或实例变量添加一些附加信息时,java注释确实很有帮助。有很多库大量使用这些注释。这些注释通过在运行时对代码进行更改来保持代码的简单性和可读性

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

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

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


对于这个库的开发人员来说,这是一个设计问题。编译时错误比运行时错误好,这是对的。也许java编译器应该有办法指定参数的注释?在这之前,一个标记接口会更好。现在有太多的关闭问题的请求……为什么人们不证明关闭问题的理由呢?向后兼容性是这些设计决策的原因。当他们只有XML文件时,他们可能不想修改java类。但是,现在他们无法在不破坏旧版本的情况下强制使用接口。通过注释,您可以使用此文件或XML文件。要想拥有一个接口,你必须改变所有代码,甚至是XML的用户。离题:提到Java和XML让我想起了这个小宝石:@coubatcheck-true,但这是一个小收获的巨大代价。如果希望编译带有注释的错误,请使用AspectJ。它允许您基于许多不同的切入点定义自定义编译器错误,包括注释(或缺少注释),您也可以使用注释处理器(apt)实现同样的功能