2012-03-15 49 views
1

我碰到这样的代码:为什么我可以使用.equalsIgnoreCase(“anoterString”)而不将其分配给变量或控制流语句内?

for (final String s : myList) 
    { 
     s.equalsIgnoreCase(test); 
     updateNeeded = true; 
     break;    
    } 

我怀疑这是不是程序员真正想做的事。我相信他打算写这样的东西:

for (final String s : myList) 
    { 
     if(s.equalsIgnoreCase(test)) 
     { 
      updateNeeded = true; 
       break; 
     } 
    } 

但是,我不明白为什么在第一个代码段没有错误。

s.equalsIgnoreCase(test);  

,因为该方法.equalsIgnoreCase(“anoterString”)返回一个布尔值,它没有被分配到任何东西,或流程控制语句

+0

您不必强制分配返回值。 – 2012-03-15 08:43:19

+0

如果您不需要它以备将来使用,则不需要分配返回的值。 – 2012-03-15 08:43:24

+0

@Michael,我明显在看第二个片段。并不是说这个问题在这个讨论的数量上值得参考......或者任何地方。 – 2012-03-15 08:57:18

回答

5

这只是一个方法调用。你不要使用方法调用的任何其他结果。

这是很少一个好主意,忽略一个非void方法的结果(特别的InputStream.read返回值有时被忽略时,它确实不应该),但语言规范不作任何试图调用这是一个问题。

2

它可能应该意思是你想象中的使用。你可以调用一个方法而不是分配它的结果,因为有时你不需要结果。

1

大多数编程语言允许您忽略方法的返回代码。 有些时候你不会在乎返回的价值,在这种情况下,你应该被允许。

2

你说得对,这可能是一个错误。但是,Java编译器无法知道equalsIgnoreCase方法是“纯函数”,即不产生副作用,除非保持其返回值,否则无意义。

+0

原则上它可能(例如,如果所调用的函数仅使用局部变量),但为什么还要考虑这种启发式和冒险绊倒某些边缘情况?就像Ben和Binyamin Sharet所说的那样,有时你只是不在意返回值,而应该是程序员的代表。在这种情况下可能是一个错误,在其他情况下可能不是这样。 – 2012-03-15 08:54:27