繁体   English   中英

如何在java中摆脱过多的空值检查?

[英]How can I get rid of excessive null checking in java?

假设我有一些像这样的代码:

Vehicle vehicle = vehicleRepostory.findByIdInitialized(vehicleId);

如果找不到Vehicle则此方法将返回null 规范说在这种情况下我必须抛出一个MyObjectNotFoundException所以代码变成这样:

Vehicle vehicle = vehicleRepostory.findByIdInitialized(vehicleId);
MyObjectNotFoundException.throwIfNull(vehicle, Vehicle.class, vehicleId);

如果我想摆脱对throwIfNull的调用,我该怎么办? 无论如何,它并不是真正的DRY和糟糕的设计选择。 必须有一些我不知道的设计模式。 我在网上搜索,但它没有发现任何真正有用的东西。

一个简单的解决方案可能是将代码放入我的存储库,但我使用SpringData,因此它只是一个接口:

public interface VehicleRepository extends Repository<Vehicle, Long>

// ...

@Query("select v from Vehicle v LEFT JOIN FETCH v.technicalData td LEFT JOIN FETCH v.registrationData rd"
    + " where v.vehicleId = ?")
Vehicle findByIdInitialized(Long vehicleId);

听起来基本上你希望你的存储库支持这个:

Vehicle vehicle = vehicleRepository.loadExisting(vehicleId);

loadExistingfindByIdInitialized之间的区别在于前者期望实体存在,如果不存在则抛出异常。

这样,所有存储库客户端都可以决定何时执行查找,他们是否希望缺少实体来导致异常。 您甚至可能会发现ID的所有查找都会引发异常 - 在这种情况下,您可以返回使用单个方法。

编辑:如果存储库是自动生成的,我将采取以下三种方法之一:

  • 包裹它
  • 扩展它
  • 修改生成器

哪种选择最合适取决于具体细节。

您可以在Java中查看@NotNull注释。 它有几种风格,其中一些在编译时进行验证,其中一些在运行时进行。 某些编辑器(如IntelliJ IDEA)可以在您进行可能导致NPE的操作时向您发出警告。

我应该使用哪个@NotNull Java注释? 避免!= null语句 http://docs.oracle.com/javaee/6/api/javax/validation/constraints/NotNull.html

如果您可以重新设计存储库本身以抛出所需的异常,那当然是最好的。 没有它,您需要修补该行为的变通方法。

一种方法是反射:在一个方法中调用repository ,该方法接收findByIdInitialized作为字符串并反射调用它。 然后该方法可以抛出适当的异常。

另一种方法可能是让一些AOP做同样的事情,但也许有更多的类型安全。

我建议你为findByIdInitialized添加一个可以为null的参数,它将是:

Vehicle findByIdInitialized(int vehicleId, boolean throwException) {
   // implementation behavior...

   if (throwException) {
       MyObjectNotFoundException.throwIfNull(vehicle, Vehicle.class, vehicleId);
   }
}

用这个:

import static java.util.Objects.requireNonNull;

.
.
.

Object o = requireNonNull(obj);

听起来你想“在方法返回后”AOP建议,拦截空值并抛出异常。

你可以使用NullObject dessign模式,但是提示异常恕我直言是最好的选择。

要保持DRY,你应该把它放在findbyIdInitialized

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM