我有点等待这个问题的'不'答案.
我很感兴趣,如果你在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) ...
Michael Borg.. 32
这是你能得到的最接近的:
Bar bar; if(foo!=null && (bar = foo.getBar())!=null){ System.out.println("Success: " + bar); } else { System.out.println("Failiure."); }
Staale.. 12
我在迭代BufferedReader的行时使用了这种技术:
BufferedReader br = // create reader String line while ((line = br.readLine()) != null) { // process the line }
所以是的,你可以做一个任务,结果将是左侧变量,然后你可以检查.但是,在测试中声明变量是不合法的,因为它们只能作用于该表达式.
这是你能得到的最接近的:
Bar bar; if(foo!=null && (bar = foo.getBar())!=null){ System.out.println("Success: " + bar); } else { System.out.println("Failiure."); }
我在迭代BufferedReader的行时使用了这种技术:
BufferedReader br = // create reader String line while ((line = br.readLine()) != null) { // process the line }
所以是的,你可以做一个任务,结果将是左侧变量,然后你可以检查.但是,在测试中声明变量是不合法的,因为它们只能作用于该表达式.
如果你想限制条形栏的范围,我会在迈克尔发布的代码周围添加{和}.
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被允许.