使用多个吸气剂时尝试捕获而不是空检查

Lor*_*der 8 java

我的问题如下,我有一个很长的Getter,即,

objectA.getObjectB().getObjectC().getObjectD().getObjectE().getName();
Run Code Online (Sandbox Code Playgroud)

由于"糟糕"的数据库/实体设计(某些事情比其他人更晚引入),它会发生getObjectB(),getObjectC()或者getObjectD()可能会返回NULL.

通常我们一直使用空值检查,但在这种情况下,我必须使用

ObjectB b = objectA.getObjectB();
if (b != null) {
    ObjectC c = b.getObjectC();
    if (c != null) {
        ObjectD d = c.getObjectD();
        if (d != null)
           return d.getObjectE().getName();
    }
}
return "";
Run Code Online (Sandbox Code Playgroud)

相反,简单地使用try-catch块会容易得多

try {
   return objectA.getObjectB().getObjectC().getObjectD().getObjectE().getName();
} catch (NullPointerException e) {
   return "";
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我真的不关心哪个对象返回NULL,它要么显示名称,要么不显示.是否有任何并发​​症或使用try-catch而不是检查是不好的设计?

感谢您的输入.

Hoo*_*pje 7

如果是使用Java 8的选项,则可以使用Optional,如下所示:

Optional.ofNullable(objectA)
    .map(a -> a.getObjectB())
    .map(b -> b.getObjectC())
    .map(c -> c.getObjectD())
    .map(d -> d.getObjectE())
    .map(e -> e.getName())
    .orElse("");
Run Code Online (Sandbox Code Playgroud)

  • @ ST-DDT这很好用,我在生产代码中使用它 - 可选的map()方法不会执行mapper函数,除非Optional包含一个值. (2认同)
  • @Hoopje是的,当然,这是对的; 如果没有,可选的#map几乎没有那么多用.这是我在第一杯咖啡之前评论的内容.:\ (2认同)