# 命名、格式与注释 ## 命名 - **必须**:类、接口和枚举使用 `UpperCamelCase`;方法、参数、字段和局部变量使用 `lowerCamelCase`;常量使用语义完整的 `UPPER_SNAKE_CASE`。 - **必须**:包名全小写,以稳定的组织与业务域命名;遵循项目现有单复数约定。 - **必须**:命名不得以 `_` 或 `$` 开头、结尾,不得使用中文、纯拼音或中英拼音混写。国际通用专名除外。 - **必须**:抽象基类使用 `Abstract` 或项目约定前缀;异常以 `Exception` 结尾;测试类遵循项目测试框架的现有命名。 - **必须**:避免无意义缩写、单字母业务变量和误导性名称。循环索引等极小作用域变量可以使用惯用短名。 - **必须**:Bean/序列化对象的布尔属性命名必须验证框架映射;默认不以 `is` 命名字段,访问器可按 JavaBeans 约定使用 `isXxx()`。 - **推荐**:DO、DTO、BO、VO、PO 等后缀只在项目已经定义其语义时使用,不自行发明相邻概念。 - **推荐**:实现设计模式时让类名表达职责,如 `OrderFactory`;不要仅为套用模式而改名。 ## 常量与字面量 - **必须**:禁止散落的业务魔法值;提取为有领域含义的常量、枚举或值对象。 - **必须**:`long` 字面量使用大写 `L`。 - **必须**:不得用一个“万能常量类”承载所有模块常量;按模块和职责控制可见性。 - **推荐**:仅在真正固定且跨实例共享时声明 `static final`;不要把可变集合伪装成常量。 - **推荐**:状态和类型码优先使用有行为约束的枚举或值对象,同时保持对外协议兼容。 ## 格式 - **必须**:服从项目 formatter、Checkstyle 或编辑器配置;不得因本文件偏好覆盖自动化格式规则。 - **必须**:控制语句始终使用大括号;关键字与左括号间保留空格;运算符两侧保留空格。 - **必须**:默认使用 4 空格缩进且不使用 Tab;项目 formatter 另有规定时从项目。 - **推荐**:单行不超过 120 字符;该限制是可读性上限,不是主动换行目标。import 和自动生成代码按工具配置处理。 - **推荐**:新增方法原则上不超过 80 行,新增类原则上不超过 500 行。生成代码、声明型配置或框架限制可例外,但应说明原因。 - **推荐**:方法保持聚焦,避免超过三层嵌套;优先使用卫语句、提取方法或清晰的布尔变量。 - **必须**:避免魔法值、重复代码、过深嵌套和无业务价值的抽象。 - **必须**:不要提交仅由全局换行、import 重排或格式化导致的无关 diff。 ### 换行策略 - **必须**:采用紧凑优先原则。完整语句、方法签名或方法调用未超过项目行宽且保持清晰时,保留在同一行。 - **必须**:不要为了形式对称、固定“一行一个参数”或提前规避行宽而主动拆行。 - **必须**:方法声明、方法调用和构造器调用需要换行时,在不超过项目行宽的前提下保留尽可能多的完整参数;仅在参数本身复杂或项目格式化工具要求时采用“一行一个参数”。 - **必须**:布尔表达式需要换行时,将每个完整条件作为一个视觉单元,并按 `&&` 或 `||` 对齐;不要拆开简短的 `Objects.equals`、判空或比较表达式的参数。 - **推荐**:短方法链保留在同一行;长方法链需要换行时,每行保留一个语义完整的调用阶段。 - **推荐**:仅在超过项目行宽、包含复杂 Lambda/匿名类/嵌套调用、需要突出语义阶段或格式化工具强制时换行。 方法签名超过行宽时,优先紧凑续行: ```java private boolean matchesRule(PmsProductDO product, ProductValidityRuleTypeEnum ruleType, LocalDateTime thresholdEndExclusive) { ``` 避免对每个参数机械换行: ```java private boolean matchesRule( PmsProductDO product, ProductValidityRuleTypeEnum ruleType, LocalDateTime thresholdEndExclusive) { ``` 布尔条件换行时,每个条件保持完整: ```java return Objects.equals(product.getMerchantNature(), ProductAttributeConstant.MERCHANT_NATURE_MERCHANT) && Objects.equals(product.getVerifyStatus(), ProductVerifyStatusEnum.VERIFIED.getCode()) && Objects.equals(product.getDeleteStatus(), DelStatusEnum.NOT_DELETED.getCode()); ``` 避免拆开单个简短条件: ```java return Objects.equals( product.getMerchantNature(), ProductAttributeConstant.MERCHANT_NATURE_MERCHANT); ``` ## 导入 - **必须**:禁止通配符导入。 - **推荐**:按静态导入、Java/Jakarta 标准库、第三方库、项目内部包分组,组间空一行。 - **推荐**:同组内按字典序排列;若项目格式化器定义了不同顺序,以格式化器为准。 - **必须**:删除未使用导入,不通过全限定类名规避正常导入。 ## 注释与 Javadoc - **必须**:公共 API、接口抽象方法和不显然的契约说明使用 Javadoc,包含参数约束、返回语义和可观察异常。 - **必须**:修改逻辑时同步更新相关注释;陈旧注释视为缺陷。 - **必须**:注释说明意图、业务原因、约束或权衡,不复述语句表面含义。 - **必须**:枚举字段或代码值必须能看出业务含义,可通过 Javadoc、构造参数或明确命名表达。 - **推荐**:TODO/FIXME 包含可追踪的任务标识和原因;若无跟踪机制则完成或删除。 - **必须**:不要保留大段注释掉的代码,版本历史可承担恢复职责。 - **必须**:所有新增类必须有 Javadoc,首句说明职责而非复述类名。 - **必须**:类 Javadoc 使用作者 `xiang`,通过 `@since` 记录实际首次创建日期,日期格式固定为 `yyyy-MM-dd`;后续修改不得覆盖首次创建日期。 - **推荐**:对复杂业务逻辑解释“为什么”和特殊规则,不逐行翻译代码;业务分支意图不明显时补充说明。 - **必须**:禁止保留 `yourname`、`TODO author` 等占位内容。 Javadoc 采用以下格式;`yyyy-MM-dd` 必须替换为实际首次创建日期,不得原样保留: ```java /** * 类的职责说明 * * @author xiang * @since yyyy-MM-dd */ ```