Java 代码审查:检查什么以及如何提供反馈
代码审查是提升软件产品质量和团队专业成长的最有效工具之一。然而,当涉及到 Java 时,许多开发者(尤其是初级开发者)要么害怕提交自己的代码进行审查,要么不知道在审查他人代码时该关注什么。在本文中,我们将详细分解在 Java 代码中具体需要检查哪些内容,以及如何提出意见,既不伤害同事的感情,又能帮助他们变得更好。
1. Java 代码中需要检查的内容:技术清单
首先想到的是语法和逻辑。但专业的审查远不止这些边界。以下是每个 Pull Request 中值得检查的关键方面。
1.1. 架构与设计
看看新的变更如何很好地融入现有架构。它是否违反了 SOLID 原则?例如,如果你看到一个类做了太多事情(上帝对象),这就有理由建议拆分它。
- 单一职责原则(SRP):每个类应该只有一个变更的理由。
- 依赖倒置原则(DIP):依赖抽象,而非具体实现。
- 模式:单例、工厂或策略模式的使用应当有合理依据,而非“以防万一”地滥用。
// 不好:类同时处理逻辑和持久化public class UserService { public void registerUser(String name) { // 验证 // 保存到数据库 // 发送邮件 }}
// 好:关注点分离public class UserService { private final UserRepository repository; private final EmailService emailService;
public void registerUser(String name) { User user = new User(name); repository.save(user); emailService.sendWelcome(user); }}1.2. 性能与内存管理
Java 是一种具有自动内存管理的语言,但这并不意味着可以忽略优化。检查:
- 循环中的字符串拼接:使用
StringBuilder或StringBuffer。 - 不必要的对象:在热点循环中创建临时对象。
- 集合:选择正确的实现(例如
ArrayList对比LinkedList)。 - 空指针异常:使用
Optional或空值检查。
// 不好:内存中有数百万个字符串String result = "";for (String s : list) { result += s;}
// 好:使用 StringBuilderStringBuilder sb = new StringBuilder();for (String s : list) { sb.append(s);}String result = sb.toString();1.3. 错误与异常处理
Java 中的错误不总是缺陷。有时是异常使用不当。要注意:
- 空的 catch 块:
catch (Exception e) {}是糟糕的做法。错误至少应该被记录日志。 - 过于通用的异常:捕获
Exception或Throwable是不良实践。 - 资源流:使用 try-with-resources 实现自动关闭。
// 不好:捕获异常但不处理try { // 一些代码} catch (Exception e) { // 不执行任何操作}
// 好:记录日志并重新抛出异常try { // 一些代码} catch (SQLException e) { log.error("数据库操作出错", e); throw new ServiceException("执行操作失败", e);}1.4. 测试与覆盖率
不检查测试的代码审查就像是“半生不熟”的审查。确保以下方面: