java中避免空指针

对于Java开发人员(从初级到专家)最糟糕的噩梦之一是空对象引用检查。 我很确定您已经看过几次这样的代码:

public void addAddressToCustomer(Customer customer, Address newAddress){
 if ( cutomer == null || newAddress == null)
 return;
 
 if ( customer.getAddresses() == null ){
   customer.setAddresses ( new ArrayList<>());
 }
 customer.addAddress(newAddress);
}

我个人不喜欢为空检查编写代码。 在这篇文章中,我将根据我在生产环境和系统中的个人经验,列出一些对我来说效果很好的事情。

  • 停止检查所有图层中的空对象。 仅将检查限制在上层,例如UI层,表示层或API控制器层。 换句话说,请确保没有空对象从上层传递到业务逻辑层。 例如,如果您正在使用Spring注释开发标准的Web应用程序,则可能会有一些类带有@Repository,@Service和@Controller注释。 控制器负责接收客户端的数据,并将其传递给@Service类进行处理。 确保没有空对象传递到服务层是他们的责任。 服务类及以下类不应为null安全。 如果使用null调用它们,则应抛出NPE来警告开发人员应解决此错误。 请记住,NPE不是用户错误,而是开发人员的错误,应始终避免。 对来自html表单的用户输入或其他用户界面输入执行相同的操作。
  • 如果您采用上述方法,您将不会再因为对象为空或不为空而编写业务逻辑。 空对象不应用于决定系统的行为。 它们是非凡的值,应将其视为错误和无效的业务逻辑状态。
  • 从方法返回列表时,请始终返回一个空列表,而不是null。 这将允许客户端在不检查null的情况下迭代列表。 迭代一个空列表是完全可以接受的,并且什么都不做,而迭代一个空列表将抛出NPE。
  • 在持久层中,当您搜索特定对象(即使用其标识符)而未找到该对象时,一种非常常见的方法是返回一个空对象。 好吧,这将使所有客户端手动检查此空值。 在这种情况下,您有两种选择。 抛出运行时异常(即ObjectNotFoundException)或返回空的Object。 我已经使用了这两个选项,我的建议是根据系统的整体体系结构以及所使用的工具/框架来对它们进行评估。
  • 在比较字符串时,请始终始终将不太可能为null的字符串放在第一位,而不是:
customer.getAddress().getStreet().equals("Times Square")

喜欢:

"Times Square".equals(customer.getAddress().getStreet())
  • 如果您正在使用或计划使用Java8,那么这里提供了新的Optional类。 检查这篇文章 ,清楚地说明了Optional的用法。

下次您要编写一些空检查代码时,请三思而后行,以决定是否多余。

翻译自: https://www.javacodegeeks.com/2014/08/avoiding-null-checks-in-java.html