访问属性属性的属性时检查空值的正确方法是什么?

时间:2012-07-26 21:08:26

标签: java coding-style nullpointerexception

在将类作为其他类的属性嵌入的常见情况下,检查空值的最佳方法是什么?

为了说明我在说什么,请说我想访问this.getObject1().getObject2().someMethod()getObject1()可以返回getObject2()的{​​{1}}。现在我正在做以下事情,这很丑陋,必须有一个更好的方法:

null

为了避免使用NPE,我必须在访问someMethod()之前检查每一步的空值。有什么更好的方法来实现这个目标?

5 个答案:

答案 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 - 尽管我感谢图书馆或遗留代码可能不会给您留下太多选择。

函数式编程语言(特别是)通过使用OptionMaybe对象来避免这个问题,这些对象可以在某种程度上用于Java。例如,请参阅this article。对于eaxmple,可以使用Scala for -reherehe简明扼要地避免长序列的空检查。但回到Java ......

理想情况下,假设你可以修改你正在调用的代码,你将重构,这样你就可以调用'outer'对象,然后调用'inner'对象,每个阶段只进行一次空检查。或者重新构造代码以避免这种深度嵌套。