为什么是myString.equals(“aString”); 不同于“aString”.equals(myString);?
我曾多次听说使用boolean equals(Object o)
来比较Strings
,最好将常量放在函数的左侧,如下所示:
- 不好:myString.equals(“aString”);
- 好:“aString”.equals(myString);
为什么是这样?
因为如果myString
为null,则会出现exception。 你知道"aString"
永远不会为null,所以你可以避免这个问题。
通常你会看到使用nullSafeEquals(myString,"aString");
到处都是为了避免这种情况(因为大多数时候你比较对象,它们不是由编译器生成的!)
这是一种防御NullPointerException
的防御技术。 如果你的常数总是在左边,你就不可能在那个equals
通话时获得NPE。
这是糟糕的设计,因为你隐藏了NullPointerExceptions。 而不是被警告字符串为空,而是会得到一些奇怪的程序行为,并在其他地方抛出exception。
但这一切都取决于’null’是否是字符串的有效状态。 一般来说,’null’应该永远不会被认为是传递的合理对象状态。