让我说一堂课
public class MyClass {
String locale;
public String getLocale(){
return this.locale;
}
public setLocale(String locale){
this.locale = locale;
}
}
现在我被告知,以下陈述有区别
myClass.getLocale().equalsIgnoreCase("en")
("en").equalsIgnoreCase(myClass.getLocale())
我一直在尝试寻找它,但无法找到。谁能帮我解释一下有什么区别吗?
执行时间是否有特别的区别?还有这两个中的哪一个是最佳实践
答案 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
时它才会失败,而第一种可能因null
或myClass
而失败,请参考{{ 1}}。
最后,如果在您的应用程序中myClass.getLocale()
不能为null
,则应坚持第二种方法。
否则,如果myClass
可能是null
,则应在执行myClass
检查之前:
null