静态代码检测工具CheckStyle
CheckStyle是SourceForge下的一个项目,提供了一个帮助JAVA开发人员遵守某些编码规范的工具。它能够自动化代码规范检查过程,从而使得开发人员从这项重要但是枯燥的任务中解脱出来。
CheckStyle检验的主要内容 包括:
Javadoc注释
命名约定
标题
Import语句
体积大小
空白
修饰符
块
代码问题
类设计
混合检查(包活一些有用的比如非必须的System.out和printstackTrace)
从上面可以看出,CheckStyle提供了大部分功能都是对于代码规范的检查,而没有提供象PMD和Jalopy那么多的增强代码质量和修改代码的功能。但是,对于团队开发,尤其是强调代码规范的公司来说,它的功能已经足够强大。Checkstyle插件可以集成到Eclipse IDE中去,能确保Java代码遵循标准代码样式。
一、Checkstyle的安装
按照实验指导书完成。
二、checkstyle的使用
1.检查单个文件
被检查的代码:
import java.util.Scanner;
public class Weather {
public static void main(String[] args) {
final int NUMBER_OF_DAYS = 10;
final int NUMBER_OF_HOURS = 24;
double[][][] data = new
double[NUMBER_OF_DAYS][NUMBER_OF_HOURS][2];
Scanner input = new Scanner(System.in);
// Read input using input redirection from a file
for (int k = 0; k < NUMBER_OF_DAYS * NUMBER_OF_HOURS; k++) {
int day = input.nextInt();
int hour = input.nextInt();
double temperature = input.nextDouble();
double humidity = input.nextDouble();
data[day - 1][hour - 1][0] = temperature;
data[day - 1][hour - 1][1] = humidity;
}
// Find the average daily temperature and humidity
for (inti = 0; i< NUMBER_OF_DAYS; i++) {
double dailyTemperatureTotal = 0, dailyHumidityTotal = 0;
for (int j = 0; j < NUMBER_OF_HOURS; j++) {
dailyTemperatureTotal += data[i][j][0];
dailyHumidityTotal += data[i][j][1];
}
// Display result
System.out.println(\"Day \" + i + \"'s average temperature is \"
+ dailyTemperatureTotal / NUMBER_OF_HOURS);
System.out.println(\"Day \" + i + \"'s average humidity is \"
+ dailyHumidityTotal / NUMBER_OF_HOURS);
}
}
}
检查结果:
可以看到在有代码不规范的那一行都有放大镜的图标。
2.检查一个项目
选中工程选择checkstyle->check code with checkstyle,检查错误即可。
练习
要求将输入的代码Weather类修改成为符合CheckStyle某种规则的编码风格。请在实验报告中说明CheckStyle检验前的代码和检验后的代码区别,并分别列出修改的每条代码是基于哪条规则做出的修改。
修改后的代码(每行错误的类型在这行代码上方的注释中):
package checksytletest;
import java.util.Scanner;
/**
* @author sure
*
*/
public class Weather //缺少 Javadoc 。'class def modifier' 缩进了4个缩进符,应为0个。
{ //'class def lcurly' 缩进了4个缩进符,应为0个。
/**
* @paramargs 字符串数组
*/
public static void main(String[] args)//缺少 Javadoc 。
{
//必须匹配表达式: '^[a-z][a-zA-Z0-9]*$'
final intnUMBEROFDAYS = 10;
//'method def' 子元素缩进了19个缩进符,应为8个
//必须匹配表达式: '^[a-z][a-zA-Z0-9]*$' 。
final intnUMBEROFHOURS = 24;
//'method def' 子元素缩进了19个缩进符,应为8个
double[][][] data = new double[nUMBEROFDAYS][nUMBEROFHOURS][2];
//- Resource leak: 'input' is never closed
//- 'method def' 子元素缩进了20个缩进符,应
//为8个。
Scanner input = new Scanner(System.in);
// Read input using input redirection from a file
//- 第 62 个字符 '{' 应位于新
//行。
//- 'for' 缩进了20个缩进符,应
//为8个。
for (int k = 0; k {//for' 子元素缩进了22个缩进符,应为12个
int day = input.nextInt();
int hour = input.nextInt();
double temperature = input.nextDouble();
double humidity = input.nextDouble();
data[day - 1][hour - 1][0] = temperature;
data[day - 1][hour - 1][1] = humidity;
//'for rcurly' 缩进了20个缩进符,应为8个
}
// Find the average daily temperature and humidity
//'for' 缩进了20个缩进符,应为8个。
//第 48 个字符 '{' 应位于新行。
for (inti = 0; i{//- 每一个变量的定义必须在它的声明处,且在同
//一行。
//- 'for' 子元素缩进了22个缩进符,应为12个。
double dailyTemperatureTotal = 0;
double dailyHumidityTotal = 0;
//- 'for' 缩进了22个缩进符,应为
//12个。
//- 第 49 个字符 '{' 应位于新行。
for (int j = 0; j {dailyTemperatureTotal += data[i][j][0];
dailyHumidityTotal += data[i][j][1];
}
// Display result
//'for' 子元素缩进了22个缩进符,应为12个。
System.out.println(\"Day \" + i + \"'s average temperature is \"
+ dailyTemperatureTotal / nUMBEROFHOURS);
System.out.println(\"Day \" + i + \"'s average humidity is \"
+ dailyHumidityTotal / nUMBEROFHOURS);
}
input.close();
}
}
修改后的代码检查结果:
可以看到修改后的代码中前方的放大镜标志消失了,表明代码符合规范。
总结
Checkstyle能够有效地帮助程序开发人员检查代码的规范问题,使开发人员能够从这
项重要但很枯燥的工作中解脱出来,从而节约大量的时间。