调用equals方法这两种方法的区别?

时间:2010-10-19 21:10:16

标签: java

接近一个。

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

接近二。

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

这两种方法有什么区别? 为什么下面的更好?

3 个答案:

答案 0 :(得分:10)

第二个更好,好像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) {。当您在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意外为空的情况下无声地失败 - 它可以防止运行时错误,但可能会出现难以追踪的错误。