提高代码的质量,除了要提高逻辑上的控制以及业务流程的理解外,代码本身也存在提高的空间,例如一些潜在的问题可以很早的就避免。类似于编码规范上的内容,如果全靠编码人员进行自行检查,那么无疑需要很大的工作量,如果可以使用代码的静态检查工具进行检查的话,那么将大大的提高编码的效率。
本文是提高代码质量系列文章的第二篇,主要介绍了如何使用checkstyle工具进行代码的自动化检查,以规避一些潜在的问题并找出代码的逻辑错误。
1. 什么是checkstyle?
Checkstyle是一个用于帮助编写Java代码的程序员来遵守特定的编码标准。Checkstyle可以自动进行代码的检查,因为代码检查非常重要,但是又很枯燥,所以可以自动的进行代码检查无疑节省了很多的工作量。Checkstyle尤其适用于强制使用编码标准的项目。
Checkstyle是完全可以进行自定义配置的,并且可以支持几乎任何的编码标准。例如提供了支持Sun Code Conventions编码标准的样例配置文件以及一些其他的样例配置文件。
Checkstyle可以检查源代码的很多方面,checkstyle的本意是检查代码的布局及样式,但是从版本3之后,就已经追加了更多的检查项目。现在的checkstyle版本已经可以检查诸如设计问题,重复代码,以及double checked locking等bug。具体请参考标准检查项和可选检查项。
可以在SourceForge的下载页面下载Checkstyle的最新版本。
相关工具:如果将Checkstyle集成到构建过程中的话,那么将起到最大的作用。Checkstyle的发布版本包含以下内容:
→ Ant Task
→ 命令行工具
另外,也有很多第三方的插件可供使用,例如Eclipse、WSAD、IntelliJ IDEA、NetBeans等流程的Java开发IDE。
2. CheckStyle的配置
Checkstyle的配置用来指定哪些模块适用于Java源文件。模块是一个以Checker模块为根元素的树结构。modules的下一层元素包括如下的内容:
® FileSetChecks:一些以输入文件为参数的模块,并引发错误消息。
® Filters:过滤审核事件的模块,包括错误消息。
® AuditListeners:报告被接受的事件。
很多检查是TreeWalker FileSetCheck模块的子模块。TreeWalker通过逐个的将Java源文件转换成抽象的语法树,然后循环它的每个子模块来处理检查结果。每个子模块检查各自特定的方面。
Checkstyle从XML文件获取配置,在XML文档中指定了配置的模型的层次以及他们的属性。当使用命令行执行Checkstyle命令(或者在ant任务中使用Checkstyle的时候)是需要提供一个包含配置文档的文件。Checkstyle的发布包中的doc目录中包含了一个样例的配置文件sun_checks.xml可以检查Sun的编码规范。
Modules
XML配置文档中由元素的name属性指定的module元素。下面是一个典型的配置片段:
<module name="Checker">
<module name="PackageHtml"/>
<module name="TreeWalker">
<module name="AvoidStarImport"/>
<module name="ConstantName"/>
<module name="EmptyBlock"/>
</module>
</module>
在上面的配置中:
® 根模块Checker包含了子模块FileSetChecks PackageHtml和TreeWalker。(PackageHtml模块检查所有的包都要有文档)
® 模块TreeWalker包含了子模块AvoidStarImport、ConstantName和EmptyBlock。这些子模块分别检查Java源文件是否有星号引入语句、合法的常两名以及是否包含空块。
对于每个配置模块,checkstyle通过module元素的name属性指定要加载的类。加载模块的类的规则如下:
® 根据指定的包名,例如加载类com.puppycrawl.tools.checkstyle.TreeWalker,<module name =” com.puppycrawl.tools.checkstyle.TreeWalker”>,这有助于第三方的模块集成到配置中。
® checkstyle预定义的包名,例如com.puppycrawl.tools.checkstyle.checks和com.puppycrawl.tools.checksty