为什么是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’应该永远不会被认为是传递的合理对象状态。