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.
});
每个 map
将 Optional
变成一个新的,但前提是源值和目标值都非空。任何时候的空值最终都会产生一个空的 Optional
,可以安全地忽略它。
如果我有这样的层次结构情况:
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.
});
每个 map
将 Optional
变成一个新的,但前提是源值和目标值都非空。任何时候的空值最终都会产生一个空的 Optional
,可以安全地忽略它。