接近一个。
if (graphType.equals("All") || graphType.equals("ALL"))
接近二。
if ("All".equals(graphType) || "ALL".equals(graphType))
这两种方法有什么区别? 为什么下面的更好?
答案 0 :(得分:10)
第二个更好,好像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) {
。当您在instanceof
对象上调用null
语句时,此测试始终返回false
。这就是"anyString".equals(null);
将返回false
。
答案 1 :(得分:4)
我觉得有必要对接受的答案提出逆向观点:
第一个更好,正是因为它会在graphType为null的情况下抛出NullPointerException。
通常,如果发现意外情况,您希望尽早停止并抛出异常,否则您可能会继续以无效状态执行该程序,并且该错误可能变得非常难以追踪。
这有时被称为“fail-fast”原则。
答案 2 :(得分:3)
romaintaz的回答绝对正确。但是,如果您像我一样,您可能更愿意使用第一种方法来使代码更易于阅读。这是断言发挥作用的地方:
assert graphType != null : "graphType is null";
if (graphType.equals("All") || graphType.equals("ALL"))
问题是,一旦您完成测试,您的用户是否会找到一种创造性的方法来使graphType = null。
我不喜欢第二种方法的另一件事是它在graphType意外为空的情况下无声地失败 - 它可以防止运行时错误,但可能会出现难以追踪的错误。