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

Jen*_*son 17 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.");
}
Run Code Online (Sandbox Code Playgroud)

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

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

已经有更简洁的代码了.如果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.");
}
Run Code Online (Sandbox Code Playgroud)

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

Bar bar = foo.getBar();
if (bar!=null) ...
Run Code Online (Sandbox Code Playgroud)

Mic*_*rdt 32

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

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


Sta*_*ale 12

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

BufferedReader br = // create reader
String line
while ((line = br.readLine()) != null) {
    // process the line
}
Run Code Online (Sandbox Code Playgroud)

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


Tof*_*eer 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被允许.