Java 多个变量的继承检查值

Java inheritance checking values for multiple variables

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

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 的情况下做到这一点?

真的没有。可以说这是 Java 的缺陷(至少通过 Java 7,参见 Scala 或可选类型),但这也不是人们实际编写 Java.

的方式

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

因为:你还打算做什么?您的示例代码非常不切实际,因为无论最内层的值是否正在更新,代码都同样乐意继续进行。没有错误处理 - 可以说,它是错误吞噬。

您的代码知道该怎么做,所以会抛出错误。错误是 NPE。

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

从 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,可以安全地忽略它。