在调用equals方法时,这两个appraoch之间的区别?
方法一。在调用equals方法时,这两个appraoch之间的区别?
if (graphType.equals("All") || graphType.equals("ALL"))
Aprroach two。
if ("All".equals(graphType) || "ALL".equals(graphType))
的是这两种方法之间的区别? 为什么下面的一个更好?
第二个更好,好像graphType
是null
,第一个代码片段将会抛出一个NullPointerException
。
注意,您可以简化使用"ALL".equalsIgnoreCase(graphType)
代码(如果你接受的值,如AlL
或aLL
...)
关于您的评论编辑:
如果graphType
是null
,在第一情况下,你会得到一个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
。
我觉得有必要提出一个逆势的观点来接受的答案:
第一个是更好的,正是因为它会抛出一个NullPointerException在graphType是空的情况。
通常,如果发现意外情况,您希望尽早停止并抛出异常,否则可能会继续执行处于无效状态的程序,并且该错误可能变得非常难以追踪。
这有时被称为“fail-fast”的原则。
这将取决于'graphType'是否允许为'null'。如果'null'是“正常”或“通常”状态,那么第二个就是OK。如果'null'表示异常行为,那么先去处理NullPointerException。 – masher 2010-10-19 22:04:23
我个人不会允许它为空。实际上,我不会使用字面常量“ALL”。我将创建一个'私有静态只读字符串AllGraphs =“ALL”;'或任何Java等价物,并在整个过程中使用它。在第一次机会时,我会将诸如“AlL”之类的东西转换为“AllGraphs”。类似于有一个常量的“ALL”,我会有一个用于“None”等。 – 2010-10-19 22:08:24
@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意外为空的情况下静静地失败 - 它可以防止运行时错误,但可能会导致难以追踪的错误。
assert graphType!= null:“graphType is null”;它在做什么以及它在这里检查什么 – John 2010-10-19 21:57:40
在开发中使用断言来测试关于软件在各个点的状态的假设;它们通常在部署中关闭(即被运行时引擎忽略)。在这种情况下,“断言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
非常感谢队友 – John 2010-10-19 22:07:22
如果在后一种情况下graphType为null – John 2010-10-19 21:14:50
它看起来像尤达条件,但...null应该被明确处理。 – 2010-10-19 21:14:56
@Hamish:尤达条件,错了什么是? – Anthony 2010-10-19 21:17:09