string.equalsIgnoreCase(object.string)与object.string.equalsIgnoreCase(string)之间的区别

时间:2018-07-14 12:40:25

标签: java string class object

让我说一堂课

public class MyClass {
    String locale;

    public String getLocale(){
        return this.locale;
    }

    public setLocale(String locale){
        this.locale = locale;
    }
}

现在我被告知,以下陈述有区别

  1. myClass.getLocale().equalsIgnoreCase("en")

  2. ("en").equalsIgnoreCase(myClass.getLocale())

我一直在尝试寻找它,但无法找到。谁能帮我解释一下有什么区别吗?

执行时间是否有特别的区别?还有这两个中的哪一个是最佳实践

3 个答案:

答案 0 :(得分:1)

myClass.getLocale().equalsIgnoreCase("en")NullPointerException为空时抛出myClass.locale

("en").equalsIgnoreCase(myClass.getLocale())无法编译。

如果您在谈论"en".equalsIgnoreCase(myClass.getLocale()),则当myClass.locale为null时,它可以正常工作。 false将返回。

答案 1 :(得分:1)

我发现的唯一区别是,在第一个示例中,语句myClass.getLocale()不是null安全的,因此以某种方式可能返回null并导致NullPointerException。

第二个是安全的,因为您在"en"上调用了一个方法,该方法永远不会null,即使您通过{{1}将null传递给该方法也不会失败}。


编辑:两种解释都假设myClass.getLocale()本身不为null,因此只有myClass会失败。在getLocale()为空的情况下,没有一个解决方案是空安全的-无论如何都会抛出NPE。 (@davidxxx)

答案 2 :(得分:0)

myClass javadoc状态:

  

将此字符串与另一个字符串进行比较,而忽略大小写考虑。   如果两个字符串相同,则忽略大小写,视为相等   长度和两个字符串中的对应字符相等   忽略大小写。

因此,这些语句的行为与String.equalsIgnoreCase(String)产生的结果相同,只要String.equalsIgnoreCase(String)调用者和String自变量(只要不是String

唯一可能有所不同的是,语句中存在null引用可能会引发null的抛出。
在您的示例中,两条语句可能会抛出NullPointerException,但不会在同一位置出现:

NullPointerException

请注意,第二种方法更健壮,因为只有在myClass.getLocale().equalsIgnoreCase("en") |-----|---- two potential NPE ("en").equalsIgnoreCase(myClass.getLocale()) |----- potential NPE myClass时它才会失败,而第一种可能因nullmyClass而失败,请参考{{ 1}}。

最后,如果在您的应用程序中myClass.getLocale()不能为null,则应坚持第二种方法。
否则,如果myClass可能是null,则应在执行myClass检查之前:

null