java-dev

Java 开发规范,包含命名约定、异常处理、Spring Boot 最佳实践等

By doccker · 451 installs

npx skills add doccker/cc-use-exp --skill java-dev

Source repository · Upstream listing

Java 开发规范 参考来源: Google Java Style Guide、阿里巴巴 Java 开发手册 工具链 命名约定 类型 规则 示例 包名 全小写,域名反转 com.example.project 类名 大驼峰,名词/名词短语 UserService , HttpClient 方法名 小驼峰,动词开头 findById , isValid 常量 全大写下划线分隔 MAX RETRY COUNT 布尔返回值 is/has/can 前缀 isActive() , hasPermission() 类成员顺序 DTO/VO 类规范 规则 说明 ❌ 禁止手写 getter/setter DTO、VO、Request、Response 类一律使用 Lombok ✅ 使用 @Data 普通 DTO ✅ 使用 @Value 不可变 DTO ✅ 使用 @Builder 字段较多时配合使用 ⚠️ Entity 类慎用 @Data JPA Entity 的 equals/hashCode 会影响 Hibernate 代理 批量查询规范 规则 说明 ❌ 禁止 IN 子句超过 500 个参数 SQL 解析开销大,执行计划不稳定 ✅ 超过时分批查询 每批 500,合并结果 ✅ 封装通用工具方法 避免每处手写分批逻辑 N+1 查询防范 规则 说明 ❌ 禁止循环内调用 Repository/Mapper stream/forEach/for 内每次迭代触发一次查询 ✅ 循环外批量查询,结果转 Map 查询次数从 N 降为 1(或 distinct 数) 常见 N+1 场景及修复模式: 场景 循环内(❌) 循环外(✅) count repo.countByXxx(id) repo.countByXxxIn(ids) → Map<id, count findById repo.findById(id) repo.findByIdIn(ids) → Map<id, entity exists repo.existsByXxx(id) repo.findXxxIn(ids) → Set<id + set.contains() 并发安全规范 规则 说明 ❌ 禁止 read modify write 先读余额再写回,并发下丢失更新 ❌ 禁止 check then act 无兜底 先检查再操作,并发下条件失效 ✅ 使用原子更新 SQL UPDATE SET balance = balance + :delta WHERE id = :id ✅ 或使用乐观锁 @Version 字段 + 重试机制 ✅ 唯一索引兜底 防重复插入的最后防线 异常处理 空值处理 并发编程 测试规范 (JUnit 5) Spring Boot 规范 Auth Filter 降级原则 规则 说明 ✅ optional auth 路径遇到无效/过期/不完整 token 时降级为匿名访问 不应返回 401/403 ❌ 禁止部分凭证用户体验差于匿名用户 如:临时 token 在公开接口返回 403 循环依赖防范(Spring Boot 3.x) Spring Boot 3.x 默认禁止构造器循环依赖。从大 Service 拆分子 Service 时必须检查依赖方向。 处理方式 优先级 适用场景 提取公共方法到独立工具类 ✅ 首选 纯工具方法(如 resolveTenantIds) @Lazy 字段注入 ⚠️ 应急 确实需要双向调用 Function< 回调 ⚠️ 备选 灵活但增加复杂度 详见 refactor safety skill 陷阱 5 分页参数规范(Spring Data JPA) Spring Data JPA 分页索引从 0 开始。重构分页参数时必须确保前后端索引基准一致。 规则 说明 全栈统一 0 based 前端、Controller、Service、JPA 全部使用 0 based 索引 Controller 默认值必须是 0 @RequestParam(defaultValue = "0") int page Service 直接使用 page PageRequest.of(page, size) ,不要 page 1 重构检查清单 : [ ] 前端调用传递 page: 0 (第 1 页) [ ] Controller 默认值是 0 [ ] Service 使用 PageRequest.of(page, size) (不减 1) [ ] 测试 page=0 和 page=1 都能正常返回数据 输入校验规范 规则 说明 ❌ 禁止 @RequestBody 不加 @Valid 所有请求体必须校验 ✅ DTO 字段加约束注解 @NotBlank 、 @Size 、 @Pattern 等 ✅ 数值字段加范围约束 @Min 、 @Max 、 @Positive 等 ✅ 分页参数加上限 size 必须 @Max(100) 防止大量查询 ✅ 枚举/状态字段白名单校验 自定义校验器或 @Pattern 常见 DTO 字段校验速查 : 字段类型 必须注解 说明 数量 quantity @NotNull @Min(1) 防止 0 或负数(负数可导致反向操作) 金额 amount/price @NotNull @Positive 或 @DecimalMin("0.01") 分页 size @Min(1) @Max(100) 防止 size=999999 拖垮数据库 分页 page @Min(1) 页码从 1 开始 百分比 rate @Min(0) @Max(100) 视业务定义范围 性能优化 陷阱 解决方案 N+1 查询 见「N+1 查询防范」章节 循环拼接字符串 使用 StringBuilder 频繁装箱拆箱 使用原始类型流 未指定集合初始容量 new ArrayList< (size) 第三方 API HTTP 客户端选型 规则 说明 ❌ 避免 RestTemplate 默认客户端调用国内平台 API 默认 HttpURLConnection 的 POST 请求与微信/支付宝等 CDN 存在兼容性问题(已知触发 412/403) ✅ 优先用 java.net.http.HttpClient (JDK 11+) 现代 HTTP 客户端,无 CDN 兼容性问题 ✅ 或配置 HttpComponentsClientHttpRequestFactory 让 RestTemplate 底层走 Apache HttpClient 诊断特征 :HTTP 错误 + body 为空 + response headers 极简(只有 Connection/Content Length)= CDN 层拦截,不是 API 本身的响应。同一 API 的 GET 正常但 POST 异常时,优先怀疑 HTTP 客户端兼容性。 Native SQL 规范 别名避免 MySQL 保留字 @Query(nativeQuery = true) 中的列别名如果是 MySQL 保留字,会导致语法错误。 高频踩坑保留字 : year month , order , status , key , value , name , type , date , time , rank , range , rows , column , user , role , group 规则 说明 ✅ 使用短别名或缩写 ym , ord status , cnt ✅ 或用反引号转义 year month ❌ 禁止直接用保留字做别名 as year month 、 as order 、 as rank 日志规范 详细参考 文件 内容 references/java style.md 命名约定、异常处理、Spring Boot、测试规范 references/collections.md 不可变集合(Guava)、字符串分割 references/concurrency.md 线程池配置、CompletableFuture 超时 references/concurrency db patterns.md Get Or Create 并发、N+1 防范、原子更新、Redis+DB 一致性 references/code patterns.md 卫语句、枚举优化、策略工厂模式 references/date time.md 日期加减、账期计算、禁止月末对齐 references/http client.md 第三方 API HTTP 客户端选型、CDN 兼容性问题 📋 本回复遵循: java dev [具体章节]