头像OAOA 创建于 2025年10月29日 修改于 2025年10月29日417次阅读

行级约定(小而频繁但决定质量的细节)

本文聚焦单行/微片段层面的统一写法,提升一致性与可读性。

1. Lombok 使用规范

  • 数据对象优先使用 @Data;涉及继承时慎用 @EqualsAndHashCode(callSuper = true)
  • 构造需求明确时使用 @Builder@AllArgsConstructor@NoArgsConstructor
  • 对外暴露的 API 模型(如请求体)避免过度使用 @Setter

示例:

java 复制代码
@Data
@Builder
public class UserDTO {
    private Long id;
    private String name;
}

反例(不必要的注解堆叠):

java 复制代码
@Data @Getter @Setter // 冗余
public class Foo {}

2. 审计与主键策略(MyBatis-Plus)

  • 统一字段:idversiondeletedcreateTimeupdateTimecreatoreditor
  • 注解:@TableIdINPUT/AUTO)、@Version@TableLogic@TableField(fill = ...)

示例:

java 复制代码
@TableId(type = IdType.INPUT)
private Long id;

@Version
private Integer version;

@TableLogic
private Integer deleted;

3. 空值/字符串/集合判断

  • 优先使用工具类:ObjectUtil.isNull/NotNullStringUtils.isBlankCollUtil.isEmpty
  • 字符串比较一律先判空,再比较:StringUtils.equalsIgnoreCase(a, b)

示例:

java 复制代码
if (ObjectUtil.isNull(v) || (v instanceof String && StringUtils.isBlank((String) v))) {
    return;
}

反例:

java 复制代码
if (v == null || v == "") { /* 忽略空格、null 字符串等场景 */ }

4. 断言与异常

  • 前置条件用 Assert.*;业务失败抛 BusinessException,交由全局异常处理。
  • 非预期异常不吞噬;日志按 context -> message -> stack 的顺序输出。

5. Jackson 序列化

  • 日期统一 yyyy-MM-dd HH:mm:ss
  • 禁止接口返回时间戳,除非有明确的性能与前端兼容需求。

6. 其他精细约定

  • 常量使用大写下划线,避免魔法数;布尔变量命名以 is/has/should 开头。
  • Lambda 表达式避免复杂逻辑,抽取方法命名意图。