你能在if子句中存储一个变量吗?

时间:2009-02-19 07:47:04

标签: java if-statement initialization

我有点等待这个问题的'不'答案。

我感兴趣的是,当您在if子句中检查变量时,可以同时保存变量。

假设我有这段代码。

if(foo!=null){
  if(foo.getBar()!=null){
    Bar bar = foo.getBar();
    System.out.println("Success: " + bar);
  } else {
    System.out.println("Failure.");
  }
} else {
  System.out.println("Failure.");
}

我现在处理“失败”状态 - 即使结果是相同的,也是独立的。我可以像这样把它们聚在一起:

if(foo!=null && foo.getBar()!=null){
  Bar bar = foo.getBar();
  System.out.println("Success: " + bar);
} else {
  System.out.println("Failure.");
} 

已有更多更简洁的代码。如果foo为null,它将停在那里并且不会尝试foo.getBar(在if中)所以我不会得到NPE。我想要提升的最后一件事,主要问题是:我真的给过两次调用foo.getBar()吗?如果getBar()将是一个非常繁重的操作,那么离开第二个相同的调用将是很好的。所以我想知道是否有可能做一些类似的事情:

if(foo!=null && (Bar bar = foo.getBar())!=null){
  Bar bar = foo.getBar();
  System.out.println("Success: " + bar);
} else {
  System.out.println("Failure.");
}

如果我愿意,我将不得不将它分解为两个不同的if

Bar bar = foo.getBar();
if (bar!=null) ...

7 个答案:

答案 0 :(得分:31)

这是你能得到的最接近的地方:

Bar bar;
if(foo!=null && (bar = foo.getBar())!=null){
  System.out.println("Success: " + bar);
} else {
  System.out.println("Failiure.");
}

答案 1 :(得分:11)

我在迭代BufferedReader的行时使用了这种技术:

BufferedReader br = // create reader
String line
while ((line = br.readLine()) != null) {
    // process the line
}

所以是的,你可以做一个任务,结果将是左侧变量,然后你可以检查。但是,在测试中声明变量是不合法的,因为它们只会限定为该表达式。

答案 2 :(得分:7)

如果你想限制条形栏的范围,我会在迈克尔发布的代码周围添加{和}。

void foo()
{
    // some code ...

    // this block limits the scope of "Bar bar" so that the rest of the method cannot see 
    // it.
    {
        Bar bar;
        if(foo!=null && (bar = foo.getBar())!=null){
            System.out.println("Success: " + bar);
        } else {
            System.out.println("Failiure.");
        }
    }
}

如果有意义,您可能还需要检查空对象模式。我个人试图避免事情为空,如果我可以......真的想想你是否想要允许null。

答案 3 :(得分:2)

来自“我的编程语言优于您的编程语言”部门:在Groovy中,您可以使用“?”。操作者:

Bar bar = foo?.bar
if (bar != null) {
}

在Java中,这是一个很好的模式(*):

Bar bar = foo == null ? null : foo.getBar();
if (bar != null) {
}

*:你可以用指尖保存的东西。

答案 4 :(得分:1)

完全没有回答这个问题的三点:

null是邪恶的。不要编写返回它的方法。然后你的示例问题就会消失。

我认为你可能会错过封装。而不是foo.getBar()可以使foo的界面成为执行“告诉不要求”的操作吗?

表达式中的副作用往往会导致错误的代码。更喜欢更简单的线条,以减少有缺陷的线条。在访问缓冲区时使用++增加索引或类似的迭代器样式算法时常见的异常。

答案 5 :(得分:0)

实际上我认为使用Java Optional是一种方法,这是一个例子:

Optional.ofNullable("text").ifPresent( $0 -> {
  System.out.println($0.toUpperCase());
});

或者在你的情况下:

  if(foo != null){
      Optional.ofNullable(foo.getBar()).ifPresent(bar -> {
          System.out.println("Success: " + bar);
      });
  }

答案 6 :(得分:0)

您不能在 Java 条件中声明变量,但可以在 d[outer_dictionary_or_list][Inner_Dictionary_Or_List][And_So_On] 循环中声明:

for

但它并不漂亮。我完全同意 Tom Hawtin 的评论。