检查null的优雅方法

时间:2015-08-19 05:35:15

标签: java hibernate

使用hibernate我多次使用这种代码:

int someId = entity.getSomething() == null ? null : entity.getSomething().getId();

当尝试应用更长的层次结构时,此代码变得更加混乱:

int someId = entity.getParent() == null ? null : 
entity.getParent().getParent() == null ? null :
entity.getParent().getParent().getSomething() == null ? null :
entity.getParent().getParent().getSomething().getId();

有更优雅的方式吗?

5 个答案:

答案 0 :(得分:6)

根据Louis Wasserman的评论,Optional几乎可以用作NullObject a'la flogy的解决方案。

使用Java 8 Optional和lambdas看起来像这样

Integer value = Optional.ofNullable(entity)
                        .map( Entity::getParent )
                        .map( Entity::getParent )
                        .map( Entity::getSomething )
                        .map( Something::getId )
                        .orElse(null);

答案 1 :(得分:2)

如果这些实体对象是由您自己而不是在库中编写的,我会考虑重构它们并使用NullObjects。就像那样,你可以直接调用

Integer someId = entity.getParent().getParent().getSomething().getId();

因为这将返回您的无效整数。

基本上,它的工作原理如下:

  1. entity.getParent()将返回NullParent实例
  2. 这个NullParent类有一个方法getParent(),它也会返回一个NullParent实例
  3. 再次,这个NullParent类有一个方法getSomething(),它将返回一个NullSomething实例
  4. NullSomething类有一个方法getId(),它最终会返回你的空整数(例如0或另一个NullInteger对象)。
  5. 以下是Why NULL is bad?

    上的一篇有趣帖子

答案 2 :(得分:1)

可读性是非常重要的因素,也是代码的简化。最好在这里使用简单的if条件。

if(entity.getParent()!=null && entity.getParent().getParent() !=null && 
     entity.getParent().getParent().getSomething()!=null &&  
              entity.getParent().getParent().getSomething().getId()!=null){


}

由于&&(“短路和”),如果false中的一个条件right非其他条件执行。

答案 3 :(得分:1)

  

有更优雅的方式吗?

您可以直接使用try-catch进行空检查:

try{
  int id = entity.getParent().getParent().getSomething().getId();
  // do something with id
} catch(NullPointerException ex) {
  // got null
}

答案 4 :(得分:0)

如果值为null,则您将分配相同的if(x != null) x = y 值。

为什么不尝试只在它不为空时才给它。

<a class="btn btn-default" data-toggle="modal" data-target="#sms-scheduling-modal" href="#",  <%= @checkvar ? 'disabled' : '' %>> Schedule a text message</a>