Java代码审查:资深开发者关注什么以及如何避免代码审查失败
您编写了代码,在本地进行了测试,运行了测试——一切通过。您打开Pull Request,几小时后看到资深同事的十几条评论。熟悉吗?Java代码审查不是官僚程序,而是对开发者成熟度的真正考验。资深开发者以不同的方式看待代码:他们不仅检查代码是否工作,更关注代码能运行多久以及修改起来有多困难。
在本文中,我们将分析经验丰富的Java开发者在代码审查中最常提出的意见。您将学习如何编写干净、可维护的代码,并一次性通过审查。
1. 忽视SOLID原则和整洁架构
这可能是资深开发者最常提出的意见。当您编写一个200行的方法或一个包罗万象的类时——这立刻会引起注意。资深开发者不会花时间分析这样的代码,他们只会要求您将其拆分。
糟糕代码示例:
public class OrderService { public void processOrder(Order order) { // 1. 验证 if (order.getItems().isEmpty()) { throw new IllegalArgumentException("Order must have items"); } // 2. 检查用户 User user = userRepository.findById(order.getUserId()); if (user == null || user.isBlocked()) { throw new SecurityException("User not valid"); } // 3. 计算折扣 double discount = 0; if (order.getTotal() > 1000) { discount = 0.1; } // 4. 保存 order.setDiscount(discount); orderRepository.save(order); // 5. 发送邮件 emailService.sendOrderConfirmation(order); }}资深开发者会说什么:“这个方法违反了单一职责原则。它负责验证、计算、保存和发送通知。请拆分成单独的方法或提取到不同的服务中。”
如何修复:
public class OrderService { private final OrderValidator validator; private final DiscountCalculator discountCalculator; private final OrderRepository orderRepository; private final NotificationService notificationService;
public void processOrder(Order order) { validator.validate(order); double discount = discountCalculator.calculate(order); order.setDiscount(discount); orderRepository.save(order); notificationService.sendOrderConfirmation(order); }}在Java开发中,单一职责原则是基础。如果您在方法中看到“and”(检查并保存并发送),那么是时候进行重构了。
2. 处理null和NPE(空指针异常)
NullPointerException是Java开发者的噩梦。资深开发者讨厌意外的NPE,并且总是关注您如何处理null。典型的意见是:“如果方法返回null会怎样?”
示例:
public String getUserEmail(Long userId) { User user = userRepository.findById(userId); return user.getEmail().toLowerCase();}资深开发者的意见:“如果找不到用户,user将为null——会导致NPE。请使用Optional或至少进行空值检查。”
修正后的版本:
public String getUserEmail(Long userId) { return userRepository.findById(userId) .map(User::getEmail) .map(String::toLowerCase) .orElseThrow(() -> new UserNotFoundException("User not found: " + userId));}使用Optional是现代Java的标准做法。