在调用equals方法时,这两个appraoch之间的区别?

问题描述:

方法一。在调用equals方法时,这两个appraoch之间的区别?

if (graphType.equals("All") || graphType.equals("ALL")) 

Aprroach two。

if ("All".equals(graphType) || "ALL".equals(graphType)) 

的是这两种方法之间的区别? 为什么下面的一个更好?

第二个更好,好像graphTypenull,第一个代码片段将会抛出一个NullPointerException

注意,您可以简化使用"ALL".equalsIgnoreCase(graphType)代码(如果你接受的值,如AlLaLL ...)

关于您的评论编辑:

如果graphTypenull,在第一情况下,你会得到一个NullPointerException。在第二种情况下,该equals方法的评价将false,如"someString".equals(null);总是返回false

这里是String.equals(String)方法的代码:

public boolean equals(Object anObject) { 
    if (this == anObject) { 
     return true; 
    } 
    if (anObject instanceof String) { 
     String anotherString = (String)anObject; 
     int n = count; 
     if (n == anotherString.count) { 
      char v1[] = value; 
      char v2[] = anotherString.value; 
      int i = offset; 
      int j = anotherString.offset; 
      while (n-- != 0) { 
       if (v1[i++] != v2[j++]) 
        return false; 
      } 
      return true; 
     } 
    } 
    return false; 
} 

source

有趣行是if (anObject instanceof String) {。当您在null对象上调用instanceof声明时,此测试始终返回false。这就是为什么"anyString".equals(null);将返回false

+0

如果在后一种情况下graphType为null – John 2010-10-19 21:14:50

+2

它看起来像尤达条件,但...null应该被明确处理。 – 2010-10-19 21:14:56

+2

@Hamish:尤达条件,错了什么是? – Anthony 2010-10-19 21:17:09

我觉得有必要提出一个逆势的观点来接受的答案:

第一个是更好的,正是因为它会抛出一个NullPointerException在graphType是空的情况。

通常,如果发现意外情况,您希望尽早停止并抛出异常,否则可能会继续执行处于无效状态的程序,并且该错误可能变得非常难以追踪。

这有时被称为“fail-fast”的原则。

+0

这将取决于'graphType'是否允许为'null'。如果'null'是“正常”或“通常”状态,那么第二个就是OK。如果'null'表示异常行为,那么先去处理NullPointerException。 – masher 2010-10-19 22:04:23

+0

我个人不会允许它为空。实际上,我不会使用字面常量“ALL”。我将创建一个'私有静态只读字符串AllGraphs =“ALL”;'或任何Java等价物,并在整个过程中使用它。在第一次机会时,我会将诸如“AlL”之类的东西转换为“AllGraphs”。类似于有一个常量的“ALL”,我会有一个用于“None”等。 – 2010-10-19 22:08:24

+2

@masher - 那是真的!虽然在这种情况下,如果null是“正常的”,我仍然希望看到明确的检查而不是隐含的巧妙,以便清楚地表明这是一个可能的预期值....否则,一些可怜的傻瓜可能会绊倒这个未来 – mikera 2010-10-19 22:09:54

romaintaz答案是绝对正确的。但是,如果您像我一样,您可能更愿意使用第一种方法来使您的代码更易于阅读。这是断言发挥作用:

assert graphType != null : "graphType is null";  
if (graphType.equals("All") || graphType.equals("ALL")) 

的问题是,用户是否会找到一个创造性的方法,使graphType =空一旦你完成测试。

我不喜欢第二种方法的另一件事是,它会在graphType意外为空的情况下静静地失败 - 它可以防止运行时错误,但可能会导致难以追踪的错误。

+0

assert graphType!= null:“graphType is null”;它在做什么以及它在这里检查什么 – John 2010-10-19 21:57:40

+0

在开发中使用断言来测试关于软件在各个点的状态的假设;它们通常在部署中关闭(即被运行时引擎忽略)。在这种情况下,“断言graphType!= null”的意思是'我期望graphType不为空'。如果graphType实际上是null,则运行时引擎将向System.out中输出指定的消息(“graphType is null”)。另请参阅http://download.oracle.com/javase/1.4.2/docs/guide/lang/assert.html和http://java.sun.com/developer/technicalArticles/JavaLP/assertions/ – 2010-10-19 22:04:54

+0

非常感谢队友 – John 2010-10-19 22:07:22