2

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

为了说明我在说什么,假设我想访问this.getObject1().getObject2().someMethod()wheregetObject1()getObject2()could return null。现在我正在做以下事情,这很丑陋,必须有更好的方法:

if (this.getObject1() != null)
        if (this.getObject1().getObject2() != null)
            if (this.getObject1().getObject2().someMethod())
                return whatever;

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

4

5 回答 5

3

另一种选择是将每个方法的结果设置为变量,这样您就不必每次都重新调用该方法。所以,像这样

Object obj1 = this.getObject1();
if (null != obj1)
{
    Object obj2 = obj1.getObject2();
    if (null != ob2)
    {
         Object obj3 = obj2.someMethod();
         if (null != obj3)
               return whatever;
    }
}

如果这些方法不昂贵,您可以选择更少的代码,if就像 Chris Nava 的解决方案一样

于 2012-07-26T21:09:44.577 回答
2

我使用 && 代替嵌套的 if()s。它只是稍微干净一点(可以说),但仍然不是我想要的。

if (
    this.getObject1() != null
    &&
    this.getObject1().getObject2() != null
    &&
    this.getObject1().getObject2().someMethod()
  ) {
            return whatever;
}
于 2012-07-26T21:14:41.763 回答
1

您可以更简化它(至少更容易阅读),例如:

Object o1 = getObject1();
if(o1 != null)
{
    Object o2 = getObject2();
    if(o2 != null)
    {
        if(o2.someMethod()) return whatever;
    }
}
于 2012-07-26T21:12:04.217 回答
1

你真的无能为力。我的意思是,你可以将每个步骤分配给一个变量,但它最终会变成更多的代码,你可以编写一个通用方法来使用反射来完成它,但它的性能会低得多,因为没有什么好的理由.

于 2012-07-26T21:12:06.817 回答
1

应尽可能避免这种风格——参见得墨忒耳法则——尽管我很欣赏库或遗留代码可能不会给你留下太多选择。

函数式编程语言(尤其是)通过使用OptionorMaybe对象来避免这个问题,在 Java 中可以在一定程度上使用这些对象。例如,请参阅这篇文章。例如,使用 Scala for-comprehensions 可以简洁地避免长序列的空值检查。但是回到Java...

理想情况下,假设您可以修改您正在调用的代码,您将进行重组,以便您可以调用“外部”对象,然后该对象将调用“内部”对象,每个阶段只有一次空检查。或者重构代码以避免这种深度嵌套。

于 2012-07-26T21:48:51.400 回答