在将类作为其他类的属性嵌入的常见情况下,检查空值的最佳方法是什么?
为了说明我在说什么,请说我想访问this.getObject1().getObject2().someMethod()
或getObject1()
可以返回getObject2()
的{{1}}。现在我正在做以下事情,这很丑陋,必须有一个更好的方法:
null
为了避免使用NPE,我必须在访问someMethod()之前检查每一步的空值。有什么更好的方法来实现这个目标?
答案 0 :(得分:3)
另一种选择是将每个方法的结果设置为变量,这样您就不必每次都重新调用该方法。所以,像这样
Object obj1 = this.getObject1();
if (null != obj1)
{
Object obj2 = obj1.getObject2();
if (null != ob2)
{
Object obj3 = obj2.someMethod();
if (null != obj3)
return whatever;
}
}
如果这些方法并不昂贵,你可以选择在Chris Nava的解决方案中使用if
的所有代码来减少代码
答案 1 :(得分:2)
我用&&代替嵌套的if()s。它只是略微清洁(可以说),但仍然不是我想要的。
if (
this.getObject1() != null
&&
this.getObject1().getObject2() != null
&&
this.getObject1().getObject2().someMethod()
) {
return whatever;
}
答案 2 :(得分:1)
您可以更简化(至少更容易阅读),例如:
Object o1 = getObject1();
if(o1 != null)
{
Object o2 = getObject2();
if(o2 != null)
{
if(o2.someMethod()) return whatever;
}
}
答案 3 :(得分:1)
你真的没什么可做的。我的意思是,你可以将每个步骤分配给一个变量,但它最终会成为更多的代码,而你可以编写一个泛型方法来使用反射来完成它,但它会少得多因为没有任何正当理由而表现出色。
答案 4 :(得分:1)
应尽可能避免使用此样式 - 请参阅Law of Demeter - 尽管我感谢图书馆或遗留代码可能不会给您留下太多选择。
函数式编程语言(特别是)通过使用Option
或Maybe
对象来避免这个问题,这些对象可以在某种程度上用于Java。例如,请参阅this article。对于eaxmple,可以使用Scala for -reherehe简明扼要地避免长序列的空检查。但回到Java ......
理想情况下,假设你可以修改你正在调用的代码,你将重构,这样你就可以调用'outer'对象,然后调用'inner'对象,每个阶段只进行一次空检查。或者重新构造代码以避免这种深度嵌套。