You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Checkstyle 代码规范
本文档根据 checkstyle.xml
配置文件生成,描述了项目所遵循的 Java 代码规范。
一、全局检查 (Checker)
这些规则应用于项目中的每个文件。
- 文件编码: 所有文件必须使用
UTF-8
编码。
- 规则严重性: 违反规则将报告为
error
级别。
- 检查范围: 检查适用于
.java
, .properties
, .xml
文件。
1.1 文件格式
规则 (Module) |
描述 |
Translation |
检查 .properties 文件中是否存在重复的键 (key)。 |
FileTabCharacter |
禁止在代码中使用 Tab 字符进行缩进,应使用空格。 |
RegexpSingleline |
禁止行尾出现多余的空格。 |
NewlineAtEndOfFile |
文件必须以一个空行结束。 |
FileLength |
单个文件长度不能超过 2500 行。 |
LineLength |
单行代码长度不能超过 300 个字符。 (package 和 import 语句、URL等除外) |
SuppressWarningsFilter |
允许使用 @SuppressWarnings 注解来抑制特定的规则警告。 |
二、Java 语法树检查 (TreeWalker)
这些规则基于 Java 的语法树,对代码结构和风格进行详细检查。
2.1 Javadoc 注释
规则 (Module) |
描述 |
JavadocType |
类和接口必须包含 Javadoc 注释。 |
JavadocMethod |
public 和 protected 方法必须有 Javadoc 注释。被 @Override 或 @Test 注解的方法除外。允许缺少 @return 标签。 |
JavadocVariable |
(已忽略) 此配置中,对变量 Javadoc 的检查级别为 ignore ,即不强制要求。 |
JavadocStyle |
检查 Javadoc 的基本格式。 |
TodoComment |
代码中不应包含 TODO 注释,表示代码中不应有未完成的功能点。 |
2.2 命名规范
规则 (Module) |
描述 |
格式 |
PackageName |
包名必须全部小写。 |
^[a-z]+(\.[a-z][a-z0-9]*)*$ |
TypeName |
类和接口名必须使用大驼峰命名法 (UpperCamelCase)。 |
^[A-Z][a-zA-Z0-9]*$ |
MethodName |
方法名必须使用小驼峰命名法 (lowerCamelCase)。 |
^[a-z][a-zA-Z0-9]*(_[a-zA-Z0-9]+)*$ |
ParameterName |
方法参数名必须使用小驼峰命名法 (lowerCamelCase)。 |
^[a-z][a-zA-Z0-9]*$ |
ConstantName |
常量 (static final ) 命名必须使用全大写字母和下划线。 |
^[A-Z][A-Z0-9]*(_[A-Z0-9]+)*$ |
StaticVariableName |
静态变量名 (static 但非 final ) 必须使用小驼峰命名法。 |
^[a-z][a-zA-Z0-9]*(_[a-zA-Z0-9]+)*$ |
MemberName |
成员变量(非静态)名必须使用小驼峰命名法。 |
^[a-z][a-zA-Z0-9_]*$ |
LocalVariableName |
局部变量名必须使用小驼峰命名法。 |
^[a-z][a-zA-Z0-9]*(_[a-zA-Z0-9]+)*$ |
LocalFinalVariableName |
局部 final 变量名必须使用小驼峰命名法。 |
^[a-z][a-zA-Z0-9]*(_[a-zA-Z0-9]+)*$ |
MethodTypeParameterName |
方法的泛型参数名必须是单个大写字母。 |
^[A-Z]$ |
2.3 定义与导入
规则 (Module) |
描述 |
ArrayTypeStyle |
数组的定义必须使用 Java 风格,例如 String[] args 而不是 String args[] 。 |
UpperEll |
long 类型的字面量必须使用大写 L (例如 123L ),避免与数字 1 混淆。 |
AvoidStarImport |
禁止使用星号 * 进行导包,例如 import java.util.*; 。 |
IllegalImport |
禁止导入 autovalue.shaded 和 avro.shaded 包,以及 sun.* 等不推荐的包。 |
RedundantImport |
移除多余的导入,例如导入了 java.lang 下的类、当前包的类或重复导入。 |
UnusedImports |
移除未被使用的 import 语句。 |
2.4 代码尺寸
规则 (Module) |
描述 |
MethodLength |
单个方法的代码行数不能超过 200 行。 |
ParameterNumber |
方法的参数数量不能超过 5 个 (构造方法和重写的方法除外)。 |
CyclomaticComplexity |
方法的圈复杂度不能超过 25,以控制方法的逻辑复杂度。 |
2.5 空白与格式
规则 (Module) |
描述 |
MethodParamPad |
方法名和左括号 ( 之间不能有空格。 |
TypecastParenPad |
类型转换时,括号内部不应有空格,例如 (String) obj 。 |
ParenPad |
其他圆括号(如 if for while 语句)内部不应有空格。 |
WhitespaceAfter |
逗号 , 、分号 ; 和类型转换的右括号 ) 之后必须有空格。 |
WhitespaceAround |
运算符(如 = + > 等)两边必须有空格。空构造器、方法等允许写成 {} 。 |
GenericWhitespace |
泛型尖括号 < > 两边不应有空格,例如 List<String> 。 |
OperatorWrap |
操作符换行时,操作符应位于行尾。 |
SingleSpaceSeparator |
代码元素(如 if 和 ( )之间应用单个空格分隔。 |
EmptyLineSeparator |
不允许在类成员之间或方法内部存在连续多个空行。 |
NoWhitespaceAfter |
一元运算符(如 ++ -- ! )之后不应有空格。 |
NoWhitespaceBefore |
逗号 , 和分号 ; 之前不应有空格。 |
2.6 修饰符
规则 (Module) |
描述 |
ModifierOrder |
类、方法、变量的修饰符必须遵循 Java 语言规范的顺序 (public , protected , private , abstract , static , final ...)。 |
RedundantModifier |
移除接口和注解中多余的修饰符(如接口方法默认为 public ,无需显式声明)。 |
2.7 代码块
规则 (Module) |
描述 |
NeedBraces |
if 、else 、for 、while 、do-while 语句必须使用花括号 {} 包围代码块,即使只有一行。 |
LeftCurly |
左花括号 { 必须位于代码块开始行的末尾。 |
RightCurly |
右花括号 } 的位置遵循约定:if/else/try/catch/finally 等语句的 } 如果后面紧跟 else 或 catch ,则不换行;其他情况(如类、方法结束)则应单独占一行。 |
AvoidNestedBlocks |
避免不必要的嵌套代码块。 |
EmptyBlock |
禁止空的 try , if , else , switch 代码块,除非在块内有注释说明。 |
EmptyCatchBlock |
禁止空的 catch 块,除非异常变量命名为 expected 或 ignored 。 |
2.8 编码实践
规则 (Module) |
描述 |
EqualsHashCode |
如果重写了 equals() 方法,必须同时重写 hashCode() 方法。 |
EqualsAvoidNull |
比较字符串时,应使用字面量调用 equals 方法,如 "literal".equals(var) ,以避免空指针异常。 |
EmptyStatement |
禁止出现空语句 (单独一个分号 ; )。 |
SimplifyBooleanExpression |
简化不必要的布尔表达式,例如 if (b == true) 应简化为 if (b) 。 |
SimplifyBooleanReturn |
简化布尔返回语句,例如 if (x) { return true; } else { return false; } 应简化为 return x; 。 |
DefaultComesLast |
在 switch 语句中,default 分支必须位于所有 case 分支之后。 |
MissingSwitchDefault |
switch 语句必须包含 default 分支。 |
HiddenField |
局部变量或方法参数不能与类的成员变量同名(隐藏成员变量),除非在构造器或 setter 方法中。 |
InnerAssignment |
禁止在表达式内部进行赋值操作,例如 String s = Integer.toString(i = 2); 。 |
IllegalInstantiation |
禁止直接实例化某些应通过工厂方法创建的类。 |
2.9 类设计
规则 (Module) |
描述 |
FinalClass |
如果一个类只有 private 构造方法,它应该被声明为 final 。 |
HideUtilityClassConstructor |
工具类(只包含 static 方法和字段的类)必须隐藏其默认的 public 构造方法,通常是提供一个 private 的构造方法。 |
VisibilityModifier |
检查类成员的可见性。 |
2.10 其他
规则 (Module) |
描述 |
Indentation |
代码必须使用 4 个空格进行缩进,相关换行策略也有规定。 |
CommentsIndentation |
注释必须与它所描述的代码保持相同的缩进级别。 |
RegexpSinglelineJava |
禁止在代码中使用 System.out.print ,应使用日志框架替代。 |