是否可以在 if 子句中存储变量?

2022-09-02 05:17:22

我有点在等待这个问题的“不”答案。

我感兴趣的是,当你在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 是空的,它将止步于此,并且不会尝试 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.");
}

如果我想做,我必须把它分解成两个不同的,如果再一次

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

答案 1

这是您可以获得的最接近的:

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

答案 2

我在迭代缓冲阅读器中的行时使用了该技术:

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

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