十年前的2004年 , Java 1.5开始提供注释。 很难想象没有此功能的代码。 实际上,首先引入了注释,以减轻开发人员编写繁琐的样板代码的痛苦,并使代码更具可读性。 考虑一下J2EE 1.4(没有可用的注释)和Java EE5。注释的采用通过消除所有配置XML大大简化了Java EE应用程序的开发。 即使在今天,更多的注释仍被添加到最新版本的Java EE中。 这样做的目的是减轻开发人员的负担并提高生产率。 其他技术和框架也广泛使用它们。

到处都有注释

让我们看一个有关注释如何简化代码的示例(摘自我有关JPA实体图的文章 ):

电影.java

@Entity
@Table(name = "MOVIE_ENTITY_GRAPH")
@NamedQueries({@NamedQuery(name = "Movie.findAll", query = "SELECT m FROM Movie m")
})
@NamedEntityGraphs({@NamedEntityGraph(name = "movieWithActors",attributeNodes = {@NamedAttributeNode("movieActors")}),@NamedEntityGraph(name = "movieWithActorsAndAwards",attributeNodes = {@NamedAttributeNode(value = "movieActors", subgraph = "movieActorsGraph")},subgraphs = {@NamedSubgraph(name = "movieActorsGraph",attributeNodes = {@NamedAttributeNode("movieActorAwards")})})
})
public class Movie implements Serializable {@Idprivate Integer id;@NotNull@Size(max = 50)private String name;@OneToMany@JoinColumn(name = "ID")private Set<MovieActor> movieActors;@OneToMany(fetch = FetchType.EAGER)@JoinColumn(name = "ID")private Set<MovieDirector> movieDirectors;@OneToMany@JoinColumn(name = "ID")private Set<MovieAward> movieAwards;
}

等一下! 简化吗? 真? 注释不应该使我的代码更具可读性吗? 此示例具有比实际代码更多的注释。 公平地说,我不包括获取器和设置器。 同样,某些带注释的代码可以更好地压缩,但这会使代码更难阅读。 当然,这是一个极端的情况。 无论如何,我很高兴,因为我获得了“年度注释狂”称号 。 谢谢卢卡斯!

我们非常依赖注释,以至于最终滥用它们。 有趣的是,在某些情况下,批注引起了他们打算解决的相同问题。

如果?

让我们像这样重写前面的示例:

电影.java

@MovieEntity
@FindAll
@LoadWithActors
@LoadWithActorsAndAwards
public class Movie implements Serializable {@Idprivate Integer id;@Nameprivate String name;@MovieActorsprivate Set<MovieActor> movieActors;@MovieDirectorsprivate Set<MovieDirector> movieDirectors;@MovieAwardsprivate Set<MovieAward> movieAwards;
}

它肯定看起来更具可读性。 但是这些注释不存在。 他们来自哪里?

@LoadWithActors

LoadWithActors.java

@NamedEntityGraph(name = "movieWithActors",attributeNodes = {@NamedAttributeNode("movieActors")}
)
public @interface LoadWithActors {}

@LoadWithActorsAndAwards

LoadWithActorsAndAwards.java

@NamedEntityGraph(name = "movieWithActorsAndAwards",attributeNodes = {@NamedAttributeNode(value = "movieActors", subgraph = "movieActorsGraph")},subgraphs = {@NamedSubgraph(name = "movieActorsGraph",attributeNodes = {@NamedAttributeNode("movieActorAwards")})}
)
public @interface LoadWithActorsAndAwards {}

其余的依次类推。 你有感觉。 这个想法是将注释元数据提取并分组到您自己的自定义注释中。 然后,您的注释可以用于表示代码中所有带注释的数据,从而更易于理解。 就像Java 8 Lambdas一样,读起来就像问题声明一样。

只是另一个例子:

WoWBusinessBean.java

@Named
@Stateless
@TransactionAttribute(TransactionAttributeType.SUPPORTS)
@ApplicationPath("/resources")
@Path("wowauctions")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public class WoWBusinessBean extends Application implements WoWBusiness {}

改写:

WoWBusinessBean.java

@RestStatelessBean("wowauctions")
public class WoWBusinessBean extends Application implements WoWBusiness {}

@RestStatelessBean

RestStatelessBean

@Named
@Stateless
@TransactionAttribute(TransactionAttributeType.SUPPORTS)
@ApplicationPath("/resources")
@Path("#{path}")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public @interface RestStatelessBean {String value() default "#{path}";
}

通常,我只编写一次这些注释来定义POJO的行为,而不再关注它们。 如果我可以为所有无状态休息服务重用一个注释,那将有多酷?

另一个不错的效果是,注释配置元数据没有直接绑定在代码中。 相反,它被抽象为另一个注释。 在这种情况下,有可能在编译/运行时中覆盖或替换这些值。

元注释

我最初是由David Blevins听说过这个概念的。 他在“ 元注释”中写了一篇关于这些想法的很好的文章,甚至写了一个可能的实现 。

为注释继承,抽象和封装提供简单的Java SE支持会很方便。 这是所有现有技术处理注释方式的重大转变。 只有每个人都开始支持这种行为才有意义。

有人可能会问,我们真的需要此功能吗? 让我们尝试权衡一些利弊:

优点

  • 简化代码。
  • 注释重用。
  • 注释配置不直接与代码绑定。 值可以被覆盖。

缺点

  • 另一层抽象。
  • 自由地创建自定义注释可以掩盖真实行为。
  • 可能会遇到某种多重继承陷阱。

结论

在可预见的将来,这种元注释不太可能在Java SE中提供。 在Java 9中,大多数焦点都放在Jigsaw中。 除了值类型和泛型专业化之外,关于Java 10的信息很少。 实际上,对于纯Java SE,所有这些注释问题都不是真正的问题。

源文件中存在的批注数量正成为有关可读性和可维护性的问题。 对于Java EE和其他类似技术尤其如此。 考虑一下HTML和CSS。 如果您正在开发HTML页面,而只需要几个CSS样式,则通常将它们内联到元素中或直接将它们包括在页面中。 如果开始使用太多样式,则可以将它们提取到外部CSS文件中,然后应用样式。 我确实认为必须通过采用元注释或其他方式来完成某些工作。 你还有其他建议吗? 请分享!

资源资源

不要忘记查看David Blevins关于Meta Annotations的帖子。 他的解释比我更好,包括技术细节。

也是带有元注释的JavaOne EJB演示文稿,由David Blevins讨论了这些想法。

还有什么比听大卫·布莱文斯本人更好的呢? Java EE 7,无限可扩展性遇到无限重用 。

翻译自: https://www.javacodegeeks.com/2014/12/annotations-annotations-everywhere.html

注释,无处不在的注释相关推荐

  1. 注释嵌套注释_注释,无处不在的注释

    注释嵌套注释 十年前的2004年 , Java 1.5开始提供注释. 很难想象没有此功能的代码. 实际上,首先引入了注释,以减轻开发人员编写繁琐的样板代码的痛苦,并使代码更具可读性. 考虑一下J2EE ...

  2. 关于eclipse的注释和反注释的快捷键

    使用eclipse那么久了额,对注释和反注释的快捷键一直很模糊,现在记下来,方便查看. 注释和反注释有两种方式.如对下面这段代码片段(①)进行注释: private String value; pri ...

  3. 使用VA助手如何快速添加注释(按doxygen注释规范)

    原文首发于微信公众号「3D视觉工坊」:使用VA助手如何快速添加注释(按doxygen注释规范) 首先,关于VA助手的破解安装教程,请参考:VS2015 Visual Assist X 破解版安装教程 ...

  4. 回调函数自定义传参_koroFileHeader:一个用于生成文件头部注释和函数注释的插件...

    小金子 读完需要 2分钟 速读仅需 1 分钟 大家好,我是你们的小金子. 今天给大家分享的这个工具呢?对于使用 VS Code 的同学来讲,是一个好东西. koroFileHeader,一个在 vsc ...

  5. powerDesigner 正向工程生成sql注释问题 (mysql注释问题)

    为什么80%的码农都做不了架构师?>>>    1:powerDesigner 使用过程发现其工具内置很多默认是支持oracle的 ,而我现在用mysql ,于是修改配置 2:pow ...

  6. Matlab 如何回退上一步、批量注释以及取消注释

    写在这里的初衷,一是备忘,二是希望得到高人指点,三是希望能遇到志同道合的朋友. (今天看到有位博主写的话,感觉很认同) 学习matlab的时候,很多时候想回退到上一步,又找不到对应选项. 想批量注释和 ...

  7. zend studio自动添加文件注释和方法注释

    zend studio自动添加文件注释和方法注释 进入首选项=>PHP=>Editor=>Template=>New Name\Description\Pattern里面分别填 ...

  8. pycharm 自动生成文件注释和函数注释

    1. 文件注释 pycharm提供了一个在新建文件自动生成文件头注释的功能,可以实现自动生成运行环境,作者.日期等必要信息,使用比较方便,配置十分简单.在anaconda 的spider也有类似的功能 ...

  9. 使用.NET中的XML注释(一) -- XML注释标签讲解

    使用.NET中的XML注释(一) -- XML注释标签讲解 作者:Xt Idt  来源:博客园  发布时间:2011-04-02 11:46  阅读:9 次  原文链接   [收藏]   一.摘要 . ...

最新文章

  1. linux shell 查找某字符串 在文件的行数
  2. 普通人学python有用吗 知乎-哪些人更有必要学习python?老男孩教育python
  3. mpvue中使用小程序云开发总结
  4. Linux中文件颜色所代表的属性和颜色
  5. oracle去掉重复记录语句
  6. 和is哪个好_眼霜哪个牌子好用?这些品牌的眼霜睡前涂一涂,黑眼圈细纹没有了...
  7. Windows图片查看器不出现下一张和上一张按钮
  8. 【javaWeb学习笔记】HTML,CSS,JS
  9. 杭州好玩景点攻略200
  10. win7+linux双系统安装
  11. 注册一个微信公众号的测试平台
  12. grab显示连不上服务器,grab 暂时链接不到服务器
  13. 12.11 蜜蜂路线
  14. 宇视录像机轮巡配置步骤
  15. JSTL标签不起作用,JSTL标签直接输出表达式
  16. orge_src版编译与安装
  17. 服务器优盘启动安装win7系统教程,晨枫u盘启动工具安装原版Win7的两种方法(32位64位系统通用)...
  18. 华为设备无线环境中的MAC认证
  19. html5中的meter标签改变颜色规则
  20. Multisim 14.3安装包下载链接及安装教程

热门文章

  1. Sentinel流控规则持久化
  2. 查找前端依赖 jquery css js 时间控件 不要用远程依赖 会变化的 card
  3. java中configmanager_Spring4新的javaConfig注解
  4. Future取消线程执行
  5. centos8启动docker-mysql8容器
  6. mysql事务基础+基于innodb的行锁+间隙锁+如何锁定行
  7. js解析json数组+java对象转json字符串
  8. jakarta ee_Jakarta EE中的规范范围
  9. docker jib_Jib –为Spring Boot应用程序构建docker映像
  10. java rop_Java命令行界面(第23部分):Rop