注释,无处不在的注释
十年前的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
注释,无处不在的注释相关推荐
- 注释嵌套注释_注释,无处不在的注释
注释嵌套注释 十年前的2004年 , Java 1.5开始提供注释. 很难想象没有此功能的代码. 实际上,首先引入了注释,以减轻开发人员编写繁琐的样板代码的痛苦,并使代码更具可读性. 考虑一下J2EE ...
- 关于eclipse的注释和反注释的快捷键
使用eclipse那么久了额,对注释和反注释的快捷键一直很模糊,现在记下来,方便查看. 注释和反注释有两种方式.如对下面这段代码片段(①)进行注释: private String value; pri ...
- 使用VA助手如何快速添加注释(按doxygen注释规范)
原文首发于微信公众号「3D视觉工坊」:使用VA助手如何快速添加注释(按doxygen注释规范) 首先,关于VA助手的破解安装教程,请参考:VS2015 Visual Assist X 破解版安装教程 ...
- 回调函数自定义传参_koroFileHeader:一个用于生成文件头部注释和函数注释的插件...
小金子 读完需要 2分钟 速读仅需 1 分钟 大家好,我是你们的小金子. 今天给大家分享的这个工具呢?对于使用 VS Code 的同学来讲,是一个好东西. koroFileHeader,一个在 vsc ...
- powerDesigner 正向工程生成sql注释问题 (mysql注释问题)
为什么80%的码农都做不了架构师?>>> 1:powerDesigner 使用过程发现其工具内置很多默认是支持oracle的 ,而我现在用mysql ,于是修改配置 2:pow ...
- Matlab 如何回退上一步、批量注释以及取消注释
写在这里的初衷,一是备忘,二是希望得到高人指点,三是希望能遇到志同道合的朋友. (今天看到有位博主写的话,感觉很认同) 学习matlab的时候,很多时候想回退到上一步,又找不到对应选项. 想批量注释和 ...
- zend studio自动添加文件注释和方法注释
zend studio自动添加文件注释和方法注释 进入首选项=>PHP=>Editor=>Template=>New Name\Description\Pattern里面分别填 ...
- pycharm 自动生成文件注释和函数注释
1. 文件注释 pycharm提供了一个在新建文件自动生成文件头注释的功能,可以实现自动生成运行环境,作者.日期等必要信息,使用比较方便,配置十分简单.在anaconda 的spider也有类似的功能 ...
- 使用.NET中的XML注释(一) -- XML注释标签讲解
使用.NET中的XML注释(一) -- XML注释标签讲解 作者:Xt Idt 来源:博客园 发布时间:2011-04-02 11:46 阅读:9 次 原文链接 [收藏] 一.摘要 . ...
最新文章
- linux shell 查找某字符串 在文件的行数
- 普通人学python有用吗 知乎-哪些人更有必要学习python?老男孩教育python
- mpvue中使用小程序云开发总结
- Linux中文件颜色所代表的属性和颜色
- oracle去掉重复记录语句
- 和is哪个好_眼霜哪个牌子好用?这些品牌的眼霜睡前涂一涂,黑眼圈细纹没有了...
- Windows图片查看器不出现下一张和上一张按钮
- 【javaWeb学习笔记】HTML,CSS,JS
- 杭州好玩景点攻略200
- win7+linux双系统安装
- 注册一个微信公众号的测试平台
- grab显示连不上服务器,grab 暂时链接不到服务器
- 12.11 蜜蜂路线
- 宇视录像机轮巡配置步骤
- JSTL标签不起作用,JSTL标签直接输出表达式
- orge_src版编译与安装
- 服务器优盘启动安装win7系统教程,晨枫u盘启动工具安装原版Win7的两种方法(32位64位系统通用)...
- 华为设备无线环境中的MAC认证
- html5中的meter标签改变颜色规则
- Multisim 14.3安装包下载链接及安装教程
热门文章
- Sentinel流控规则持久化
- 查找前端依赖 jquery css js 时间控件 不要用远程依赖 会变化的 card
- java中configmanager_Spring4新的javaConfig注解
- Future取消线程执行
- centos8启动docker-mysql8容器
- mysql事务基础+基于innodb的行锁+间隙锁+如何锁定行
- js解析json数组+java对象转json字符串
- jakarta ee_Jakarta EE中的规范范围
- docker jib_Jib –为Spring Boot应用程序构建docker映像
- java rop_Java命令行界面(第23部分):Rop