首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用java.lang.annotation.Retention的原因是什么?

使用java.lang.annotation.Retention的原因是什么?
EN

Stack Overflow用户
提问于 2016-05-06 12:39:02
回答 1查看 3.6K关注 0票数 19

我很清楚RetentionPolicy的含义,知道它们做什么,什么时候 to make sense to use them。对于我自己的注释,我确切地知道它们是在运行时、在类文件中还是在编译时需要它们。但是,对于库中定义的任何批注,您都可以永远不确定。

例如,javax.annotation.Generated旨在标记生成的代码,但它很少有用。由于处理字节码的工具比处理源代码的工具多,所以信息在使用之前就消失了。

由于在运行时don't throw ClassNotFoundException中缺少注释(与缺少的接口不同),使用RetentionPolicy.RUNTIME似乎没有什么坏处。还是我错了?

或者节省几个字节就是使用不同Retention的原因?对我来说,这似乎造成了太多的问题,这是值得的。我遗漏了什么?

EN

回答 1

Stack Overflow用户

发布于 2016-05-12 15:18:57

注释的主要目的是为编译单元携带元数据。大多数标准注释都清楚地表达了有助于代码开发和编译的元信息(通过指定可由IDE或编译器验证的属性)。

注释不是为修改语言的运行时语义而设计的。因此,注释在运行时是否可用本身并不会改变执行。(当然,如果您主动使用元信息来调整您的实现行为,那么任何事情都是可能的。)

如果在库jar中,某个批注被标记为RetentionPolicy.RUNTIME,那么从运行时访问批注(使用反射)对以后的用户是很有用的。

如果注释的实现同时来自另一个库,那么这种期望要么是不必要的,要么是由于该注释的特定用途,而该用途可能只对某些用例有帮助。(并且仅仅为不同的保留设置构造不同的jar版本肯定是不合适的。)

因此,如果开发人员将注释标记为RetentionPolicy.RUNTIME,那么在期望运行时访问的地方会有一个清晰的用例。然后,注解实现是使用相同的jar还是不同的jar提供的,可能与用例无关(例如,基于其他结构化标准)。在任何情况下,如果您打算从这个用例中受益,那么您将在类路径中拥有这个注释库(因为您可能还需要其他组件),一切都很好。如果您不适用于此用例,那么您将不会因为缺少注释实现而受到影响。

根据你的问题重新措辞:

使用RUNTIME保留不会对程序造成任何损害,除了使带有死信息的可执行文件(字节码)变得混乱之外。仅在预期(并被认为有用)元信息的运行时使用RUNTIME保留会增加代码质量(在可维护性和可理解性方面)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37064357

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档