2

如果我有这样的层次结构情况:

class foo1{
    Foo2 foo2;
}

class foo2 {
    List<Foo3> foo3;
}

class foo3 {
}

class foo4 extends foo3 {
    Foo5 foo;
}

class foo5 {
    double value;
}

我想获得最终结果,double value但要到达那里,我必须沿着层次结构向下检查所有空值。我可以做这样的事情:

if(foo1 != null) {
    if(foo.foo2 != null) {
        if(foo.foo2.foo3 != null) {
            if( ((foo4) foo.foo2.foo3).getFoo5() != null) {
                if(((foo4) foo.foo2.foo3).getFoo5().getValue() != null) {
                    //do something
                }
            }
        }
    }
}

但这看起来很丑陋,并且可能有一些更容易和更清洁的方法来实现相同的目标。我遇到过使用反射,但我不确定如何以上述方式使用它。任何想法如何在不抛出 NPE 的情况下做到这一点?

4

2 回答 2

2

真的没有。可以说这是 Java 的一个缺陷(至少在 Java 7 中,请参阅 Scala 或 Optional 类型),但这也不是人们实际编写 Java 的方式。

换句话说,只需抛出一个 NPE。在现实生活中,其中大多数不应该为空。例如,如果一个Person类有一个firstName字段,它真的应该总是有一个firstName礼物。无需检查是否firstName存在。如果不是,那就是错误。如果是错误,则抛出错误。

因为:你还要做什么?您的示例代码非常不切实际,因为无论最里面的值是否正在更新,代码都同样乐意进行。没有错误处理——可以说,这是错误吞咽。

您的代码知道该怎么做,因此会引发错误。错误是 NPE。

如果您的代码确实知道要在每个分支上做什么,那么您需要编写 5 个分支。那是真正的圈复杂度。您不能希望消除圈复杂性 - 您实际上必须编写 5 个逻辑块来处理它。但同样,这不是访问那么远的通常情况。

于 2015-11-03T01:34:59.987 回答
2

从 Java 8 开始,您可以利用Optional.

Optional.ofNullable(foo1)
    .map(f1 -> f1.foo2)
    .map(f2 -> f2.foo3)
    .map(f3 -> (foo4) f3)
    .map(f4 -> f4.getFoo5())
    .ifPresent(f5 -> {
        // Do something with f5.
    });

每个都mapOptional转换为新的,但前提是源值和目标值都为非空值。任何时候的空值最终都会产生一个Optional可以安全忽略的空值。

于 2015-11-03T01:37:35.500 回答