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.

140 lines
8.4 KiB

1 month ago
---
alwaysApply: true
---
# 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`,应使用日志框架替代。 |