Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.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 - Fatal编程技术网

Java中注释处理的缺点?

Java中注释处理的缺点?,java,Java,我正在考虑启动一个项目,该项目用于使用注释在Java中生成代码(我不会深入讨论细节,因为这并不真正相关)。我想知道这个项目的有效性和有用性,让我印象深刻的是对注释处理器工具(apt)的依赖 我想知道的是,根据经验,在Java中使用注释处理有哪些缺点 这些可能是任何东西,包括: 编写处理器时很难进行TDD 在构建系统中包含处理是很困难的 处理需要很长时间,很难让它快速运行 在IDE中使用注释需要每个都有一个插件,以使其在报告错误时表现相同 这些只是例子,不是我的观点。我正在研究这些是否属实(包

我正在考虑启动一个项目,该项目用于使用注释在Java中生成代码(我不会深入讨论细节,因为这并不真正相关)。我想知道这个项目的有效性和有用性,让我印象深刻的是对注释处理器工具(apt)的依赖

我想知道的是,根据经验,在Java中使用注释处理有哪些缺点

这些可能是任何东西,包括:

  • 编写处理器时很难进行TDD
  • 在构建系统中包含处理是很困难的
  • 处理需要很长时间,很难让它快速运行
  • 在IDE中使用注释需要每个都有一个插件,以使其在报告错误时表现相同
这些只是例子,不是我的观点。我正在研究这些是否属实(包括问这个问题;-))

我确信一定有缺点(例如,特别是不使用预处理器作为优势),但我没有经验告诉你它们是什么

使用注释处理的唯一合理替代方法可能是为相关IDE创建插件以生成代码(这可能与重写/实现方法特性有点类似,该特性将生成没有方法体的所有签名)。然而,每次代码的相关部分发生更改时,都必须重复该步骤,据我所知,注释处理不会重复


关于给定的大量注释的示例,我不认为需要这样的使用,对于任何给定的类,可能需要少量注释。当然,这并不能阻止它被滥用。

一个有助于回答这个问题的具体问题是,与什么相反?不做项目,或者不使用注释?如果不使用注释,还有哪些替代方案

就我个人而言,我发现过多的注释不可读,而且很多时候过于死板。请看一下web服务上实现供应商所需WSDL的一种方法:

    @WebMethod(action=QBWSBean.NS+"receiveResponseXML")
@WebResult(name="receiveResponseXML"+result,targetNamespace = QBWSBean.NS)
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
public int receiveResponseXML(
        @WebParam(name = "ticket",targetNamespace = QBWSBean.NS) String ticket,
        @WebParam(name = "response",targetNamespace = QBWSBean.NS) String response,
        @WebParam(name = "hresult",targetNamespace = QBWSBean.NS) String hresult,
        @WebParam(name = "message",targetNamespace = QBWSBean.NS) String message) {

我觉得那段代码很难读懂。不过,XML配置替代方案并不一定更好。

我已经创建了一组JavaBean注释()

[注意:我正在开发新版本,因此主干代码与更新站点下载不匹配]

测试

测试它们可能非常困难

我通常通过在eclipse中使用测试代码创建一个项目并构建它来实现它,然后进行复制并关闭注释处理

然后,我可以使用Eclipse将“活动”测试项目与项目的“预期”副本进行比较

我还没有太多的测试用例(生成这么多的属性组合非常繁琐),但这很有帮助

构建系统

在构建系统中使用注释实际上非常容易。看一个在ant脚本中如何使用它的示例,在eclipse中使用它只需制作一个指定注释处理器扩展的插件,并在想要使用它的项目中启用注释处理

我在连续构建环境中使用了注释处理,构建注释和处理器,然后在构建的其余部分使用它。这真的很无痛

处理时间

我还没有发现这是一个问题-小心你在处理器中做什么。我在我的程序中生成了很多代码,运行良好。蚂蚁的速度稍微慢一点

请注意,Java6处理器可以运行得更快一些,因为它们是正常编译过程的一部分。然而,我很难让它们在代码生成能力中正常工作(我认为主要问题在于eclipse的支持和运行多阶段编译)。现在,我坚持使用Java5

错误处理

这是注释API中经过深思熟虑的最好方法之一。API有一个处理所有错误的“messenger”对象。每个IDE都提供了一个实现,可以在代码的正确位置将其转换为适当的错误消息

我所做的唯一一件特定于eclipse的事情是强制转换processing environment对象,以便检查它是作为构建运行还是作为编辑器协调运行。如果编辑,我退出。最后,我会将此更改为在编辑时只进行错误检查,以便它可以在您键入时报告错误。不过,要小心--在对账或编辑过程中,您需要保持非常快的速度以供使用

代码生成问题解决了

[每评论增加一点内容]

批注处理器规范声明不允许修改包含批注的类。我怀疑这是为了简化处理(进一步的循环不需要包括注释类,也可以防止无限的更新循环)

但是,您可以生成其他类,他们推荐这种方法

我为所有get/set方法和需要生成的任何其他方法生成一个超类。我还让处理器验证带注释的类是否扩展了生成的类。例如:

@Bean(...)
public class Foo extends FooGen
我在同一个包中生成一个名为注释类加上“Gen”的类,并验证注释类是否声明为扩展它

我见过有人使用编译器树api修改带注释的类——这是违反规范的,我怀疑他们会在某个时候堵塞这个漏洞,所以它不会工作

我建议生成一个超类

总体

我真的很高兴使用注释处理器。设计非常好,特别是在IDE/命令行构建独立性方面

现在,我建议坚持使用t