在 Java 开发中,代码 CR(Code Review,代码审查) 是保障代码质量、统一团队规范、发现潜在问题的重要环节。以下是 Java 代码 CR 的核心关注点和具体实践:
一、代码 CR 的核心目标
- 代码质量:确保代码正确性、健壮性、可维护性。
- 规范统一:遵循团队编码规范,保持代码风格一致。
- 风险预防:发现潜在 Bug、性能瓶颈、安全隐患。
- 知识共享:促进团队成员技术交流,提升整体水平。
二、Java 代码 CR 的 10 大审查重点
1. 代码规范与风格
- 命名规范:类名大驼峰、方法名小驼峰、常量全大写。
// Bad ❌ public class userService { ... } // Good ✅ public class UserService { ... } public static final int MAX_RETRY_TIMES = 3;
- 代码格式:缩进、空格、括号位置(遵循团队约定或工具如 Checkstyle)。
- 注释清晰:关键逻辑需有注释,避免冗余或无意义注释。
// Bad ❌ int a = 10; // 设置a为10 // Good ✅ // 根据用户等级计算折扣率(等级越高折扣越大) double discountRate = calculateDiscount(userLevel);
2. 面向对象设计
- 单一职责原则:类/方法是否职责单一。
// Bad ❌:一个方法处理订单又发送邮件 public void processOrderAndSendEmail(Order order) { ... } // Good ✅:拆分职责 public void processOrder(Order order) { ... } public void sendOrderConfirmationEmail(Order order) { ... }
- 继承与多态:避免过度继承,优先使用组合。
- 接口设计:接口是否简洁,是否符合开闭原则。
3. 异常处理
- 捕获具体异常:避免直接
catch (Exception e)
。// Bad ❌ try { ... } catch (Exception e) { ... } // Good ✅ try { ... } catch (FileNotFoundException e) { ... }
- 资源释放:确保
Connection
、Stream
等资源在finally
或try-with-resources
中关闭。// Good ✅ try (BufferedReader reader = new BufferedReader(new FileReader("file.txt"))) { // 使用资源 } catch (IOException e) { ... }
- 自定义异常:业务异常应封装为明确的异常类型。
4. 性能优化
- 避免重复计算:循环内减少冗余操作。
// Bad ❌:每次循环都调用 size() for (int i=0; i < list.size(); i++) { ... } // Good ✅ int size = list.size(); for (int i=0; i < size; i++) { ... }
- 对象复用:减少不必要的对象创建(如字符串拼接用
StringBuilder
)。 - 集合使用:根据场景选择
ArrayList
/LinkedList
,初始化指定容量。
5. 线程安全
- 共享资源同步:多线程访问共享数据时使用
synchronized
或并发工具。// Bad ❌:非线程安全的累加 private int count = 0; public void increment() { count++; } // Good ✅ private AtomicInteger count = new AtomicInteger(0); public void increment() { count.incrementAndGet(); }
- 避免死锁:按固定顺序获取锁,设置超时机制。
6. 安全性
- SQL 注入:禁止拼接 SQL,使用预编译
PreparedStatement
。// Bad ❌ String sql = "SELECT * FROM users WHERE id = " + userId; // Good ✅ String sql = "SELECT * FROM users WHERE id = ?"; PreparedStatement stmt = connection.prepareStatement(sql); stmt.setInt(1, userId);
- 敏感数据:日志中避免输出密码、Token 等。
- 输入校验:对用户输入做合法性校验(如正则表达式)。
7. 测试覆盖
- 单元测试:关键逻辑是否有测试用例,边界条件是否覆盖。
// 示例:JUnit 测试 @Test void testCalculateDiscount() { assertEquals(0.9, calculateDiscount(Level.VIP)); assertEquals(1.0, calculateDiscount(Level.NORMAL)); }
- Mock 依赖:使用 Mockito 隔离外部服务依赖。
8. 可读性与维护性
- 方法长度:单个方法不超过 50 行(可配置),过长需拆分。
- 魔法数字:避免直接使用未解释的字面量。
// Bad ❌ if (status == 3) { ... } // Good ✅ private static final int STATUS_COMPLETED = 3; if (status == STATUS_COMPLETED) { ... }
- 复杂度控制:降低圈复杂度(Cyclomatic Complexity),避免多重嵌套。
9. 依赖管理
- 包引入:移除无用
import
,避免依赖冲突。 - 版本管理:Maven/Gradle 依赖版本是否统一。
10. 日志规范
- 日志级别:合理使用
DEBUG
/INFO
/ERROR
。 - 日志内容:关键操作需记录日志,包含上下文信息。
// Bad ❌ logger.error("Error occurred"); // Good ✅ logger.error("Failed to process order [orderId={}, userId={}]", orderId, userId, e);
三、代码 CR 的辅助工具
工具类型 | 常用工具 | 作用 |
---|---|---|
静态代码分析 | SonarQube、SpotBugs | 检查代码漏洞、坏味道 |
代码格式化 | Spotless、Checkstyle | 自动格式化代码,强制风格统一 |
依赖管理 | Maven Dependency Plugin | 分析依赖冲突 |
测试覆盖率 | JaCoCo、Cobertura | 统计测试覆盖率 |
代码审查平台 | GitHub PR、GitLab MR | 在线协作审查代码 |
四、代码 CR 的流程建议
- 小步提交:每次 PR/MR 只包含一个明确的功能或修复。
- 明确描述:提交时写明背景、改动点、测试结果。
- 自动化检查:在 CI/CD 流程中集成代码扫描、测试和构建。
- 分层审查:
- 第一层:工具自动化检查(格式、静态分析)。
- 第二层:开发者自检(测试用例、文档更新)。
- 第三层:人工审查(设计合理性、业务逻辑)。
五、常见代码坏味道(Code Smells)
- 重复代码:提取公共方法或工具类。
- 过长参数列表:封装为对象或使用 Builder 模式。
- 过度注释:代码应自解释,注释仅补充“为什么”而非“做什么”。
- 僵尸代码:删除无用代码、注释掉的代码。
六、总结
Java 代码 CR 是持续改进代码质量的核心实践,需结合人工经验与自动化工具,重点关注 设计合理性、规范符合性、可维护性。通过 CR 不仅能提升代码质量,还能促进团队技术成长,形成高效协作的文化。