行级约定(小而频繁但决定质量的细节)
本文聚焦单行/微片段层面的统一写法,提升一致性与可读性。
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)
- 统一字段:
id、version、deleted、createTime、updateTime、creator、editor。 - 注解:
@TableId(INPUT/AUTO)、@Version、@TableLogic、@TableField(fill = ...)。
示例:
java
@TableId(type = IdType.INPUT)
private Long id;
@Version
private Integer version;
@TableLogic
private Integer deleted;
3. 空值/字符串/集合判断
- 优先使用工具类:
ObjectUtil.isNull/NotNull、StringUtils.isBlank、CollUtil.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 表达式避免复杂逻辑,抽取方法命名意图。
