注释嵌套注释

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

到处都有注释

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

电影.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听说过这个概念的。 他在Meta Annotations帖子中写了一篇关于这些想法的很好的文章,甚至写了一个可能的实现 。

对注释继承,抽象和封装具有简单的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. java注释搞笑图案_搞笑的代码注释,那些有趣的程序员

    发表于 2019-04-24 16:11:26 by 月小升 搞笑 /*** * .::::. * .::::::::. * ::::::::::: F*CK YOU * ..:::::::::::' ...

  2. python中注释的快捷键_【Python】注释

    一.Python注释: 1.单行注释 python中单行注释采用 # 开头. #!/usr/bin/python # coding:utf-8 import os import sys import ...

  3. aop 获取注解注释的方法_带有AOP和注释的Java方法记录

    aop 获取注解注释的方法 有时,我想记录(通过slf4j和log4j )方法的每次执行,查看其接收的参数,返回的内容以及每次执行花费的时间. 这是我在AspectJ , jcabi-aspects和 ...

  4. 注释嵌套注释_注释梦Night

    注释嵌套注释 @XmlElementWrapper(name="orders") @XmlJavaTypeAdapter(OrderJaxbAdapter.class) @XmlE ...

  5. 注释嵌套注释_DIY注释

    注释嵌套注释 从Java 5开始,Java中出现了注释. 我想做一个自己的注释,只是为了看看需要什么. 但是,我发现它们只是接口. 有擦 接口后面没有牙. 必须执行一些代码. 我认为这是橡胶行之有效的 ...

  6. java 代码注释搞笑_搞笑的代码注释,那些有趣的程序员

    发表于 2019-04-24 16:11:26 by月小升 搞笑 /*** * .::::. * .::::::::. * ::::::::::: F*CK YOU * ..:::::::::::' ...

  7. java注释和注解_注释注解JAVA注解

    发一下牢骚和主题无关: package anno; import java.lang.annotation.Retention; import java.lang.annotation.Retenti ...

  8. java扫描注解_使用Spring Java注释扫描

    我有几个需要用名称注释的类,因此我将注释定义为 @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) public @interf ...

  9. 注释,无处不在的注释

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

最新文章

  1. 死锁是什么?死锁产生的条件?如何避免死锁?以及死锁的示例代码(Java代码)
  2. Linux系统安装gcc/g++详细过程
  3. quartz mysql 建表_quartz创建表语句
  4. Winform中将WebBrower浏览器控件由IE内核修改为Chrome的WebKit内核
  5. [转]一个简单的反射拷贝一份新的实体类
  6. 如何利用ide进行跟踪调试_使用调试器进行事后跟踪
  7. 自定义Toast 很简单就可以达到一些对话框的效果 使用起来很方便
  8. 领域应用 | 美团商品知识图谱的构建及应用
  9. 关于JS闭包,作者不详(转)
  10. 循环 Request.ServerVariables
  11. 17.立体匹配——匹配两个图 Matlab实战,立体效果_3
  12. 调试安装php源码,Xdebug的安装与配置,帮助调试PHP程序
  13. linux 抓包文件 导出,Fiddler抓包13-fiddler 抓包导出 curl 命令行
  14. fatal error LNK1104:无法打开***.exe
  15. C语言程序设计-翁恺(初学者日记)
  16. “新基建”奏响项目建设最强音,长沙上半年重大项目完成投资2142亿元
  17. 专升本高数——第九章 无穷级数【学习笔记】
  18. LR(1)项目集族的构造:如何确定前向搜索符(旧版)
  19. Unity 游戏场景
  20. iOS调用各大地图APP导航,进行路线规划

热门文章

  1. jzoj4273-圣章-精灵使的魔法语【线段树】
  2. 【做题记录】人类智慧
  3. P6240 好吃的题目(分治+背包)
  4. NOI2021模拟测试赛 解题报告
  5. BufferedInputStream与ImageInputStream
  6. Java命令学习系列(二)——Jstack
  7. 3班的第一次模拟面试
  8. jQuery遍历div,判断是否为空,为空时执行某个操作
  9. sqlserver中常用的几个存储过程
  10. 微信消息提醒与消息数字提示之BadgeView