4

考虑以下代码片段:

if (foo != null
 && foo.bar != null
 && foo.bar.boo != null
 && foo.bar.boo.far != null)
{
    doSomething (foo.bar.boo.far);
}

我的问题很简单:有没有更简单\更短的方法来做到这一点?

详细说明:是否有更简单的方法来验证链的每个部分,我想类似于这个..

if (validate("foo.bar.boo.far"))
{
    doSomething (foo.bar.boo.far);
}
4

6 回答 6

5

也许是这样?

if (FooUtils.isFarNotEmpty(foo)){
    doSomething (foo.bar.boo.far);
}

并在FooUtils

boolean isFarNotEmpty (Foo foo){
   return foo != null && 
          foo.bar != null && 
          foo.bar.boo != null && 
          foo.bar.boo.far != null;
}
于 2013-05-21T06:14:35.070 回答
2

在我看来,这个表达是完美的,没有什么比这更简单的了

于 2013-05-21T06:14:25.247 回答
1

如果这是您的 API,请考虑一些建议

“我称之为我的十亿美元错误。” - CAR Hoare 爵士,关于他发明的空引用

于 2013-05-21T06:35:59.723 回答
1

为什么要使用公共实例变量,封装你的公共变量并为它们创建getter和setter,你可以在你的getter中执行这些检查,如果它们中的任何一个为null,你可以返回new Object(),或者你可以运行这个语句在 try-catch 块中但不推荐,

于 2013-05-21T06:26:31.367 回答
0

不幸的是,您对此无能为力。如果你问我,这是 Java 语言的问题。Groovy 有一个叫做Safe Navigation Operator 的东西?这是专门为此目的。这是我过去做过的两件事。

  1. Grisha已经给出的答案,我不再重复
  2. 天真地编写访问它的代码,并将其包围在 NPE 的 try/catch 中。这是一个例子:

    try {
        if (foo.bar.boo.far != null) {
            //do something
        }
    } catch (NullPointerException e) {
        //do what you would do in an else
    }
    

我不是特别喜欢第二个选项,但我说如果它确实使代码更干净,请考虑使用它。

有一次我正在使用一个库,它是一个非常薄的 XML 模式包装器,我决定在这种情况下使用第二个选项。如果我不这样做,代码会更难维护,因为很容易忘记空值检查,而且它们会弄乱重要的逻辑。我认为这是使用它的有效案例。

于 2013-05-21T06:32:03.150 回答
0

请尝试此代码

try {
    if (foo.bar.boo.far != null) {
        //No object is null
    }
} catch (Exception e) {
    // some object is null and causes null point exception.
}
于 2013-05-21T06:34:05.200 回答