2009-02-19 77 views
12

我有点在等待这个问题的'不'的答案。你可以在if子句中存储一个变量吗?

我感兴趣的是如果您可以在if-clause中检查时同时保存一个变量。

假设我有这个代码。

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."); 
} 

我将不得不如果再次是将它分解到两个不同的,如果我想这样做

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

顺便说一下,这是“失败”。 – 2009-02-19 14:53:43

回答

25

这是最接近你可以得到:

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

是的,这实际上工作。我尝试在if内部有(Bar bar = foo.getBar())!= null,但是java似乎并不希望在if子句中有Object的初始化。谢谢! – 2009-02-19 07:59:06

10

我有

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

所以,是的,你可以做一个任务,结果关闭,这将是左边的变量,然后你就可以检查:从一个BufferedReader进行遍历时,在线路使用的技术。但是,在测试中声明变量是不合法的,因为它们只会被限制在该表达式中。

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或被允许。

2

从部门“我的编程语言比您的编程语言更好”:在Groovy中,您可以使用“?”。运营商:

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

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

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

*:有些事情,你可以在你的指尖保存。

1

三点完全不能回答这个问题:

null是邪恶的。不要编写返回它的方法。您的示例问题将消失。

我想你可能会错过封装。而不是foo.getBar()foo的界面可以做成这样,你执行一个“告诉别人问题”的操作?

表达式中的副作用往往会导致错误的代码。选择更多,更简单的线条来减少错误的线条。如果在访问缓冲区时使用++来增加索引或类似的迭代器样式算法,通常会发生异常。

相关问题