使用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();
有更优雅的方式吗?
答案 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();
因为这将返回您的无效整数。
基本上,它的工作原理如下:
答案 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>