在将字符串变量与带有.equals()的字符串文字进行比较时,是否存在关于项目顺序的标准做法?[关闭]


11

每个都有好处,我了解其中的区别,但是什么是最佳/标准做法?又为什么呢?

例如 :

"myString".equals(myStringVar)
  • 避免潜在的NPE,并且不需要空检查。(好东西?)
  • 读取的更干净,因为不需要空检查。
  • 如果null不是期望值,则您的程序可能会中断而没有任何明智之举。

然而

myStringVar.equals("myString")
  • 如果null为期望值,则需要进行null检查。(好东西?)
  • 可以使用空检查使复合条件变得混乱。
  • 允许NPE通知我们是否发生了故障。

哪个变体被认为是Java使用的标准,为什么?


2
是否为null是期望值,是否应该使用“等于”运算确定这是问题所在?
马修·弗林

我认为不是。但这是我的看法。我想听听别人的理由。
BrandonV'5

在使用=和/或==进行赋值/比较的语言中,通常最好的做法是将无法更改的内容放在左侧,这样在进行比较时就不会进行意外赋值。对于在.equals之类的对象上使用方法的语言,我认为这并不重要。
GordonM '16

Answers:


3

我怀疑这是由于在较旧的C(或C ++)中编程时使用的安全预防措施引起的。在C语言中,当您打算测试相等性时,可能会意外地分配一个值:

if (x = 3)

由于将xa的赋值为3,而不是测试x是否等于3,因此该条件将始终为真。为避免这种细微的错误,开发人员开始反转该条件:

if (3 = x)

它包含相同的“错误”,但会生成编译器错误,因此更安全。

较现代的语言不存在此问题,当您尝试执行此类操作时,它们可以轻松警告您。因此,这并不是纯粹的偏好,因此选择一个并持续使用它。


-1这不是Java约定使用的原因equals。与C语言不同,Java的问题在于,x.equals(y)如果x为null ,则表达式将抛出NPE 。如果您具有String文字,"something"并且希望将大小写null视为“不等于”,则"something".equals(y)在不知道是否y可以为null 的情况下编写该字符串是有意义的。这将永远不会抛出NPE。
Andres F.

1
  • 标准和良好做法会因您所工作的组织的文化而异

  • 我们在.NET中的标准myStringVar == "myString"仅仅是因为我们已经达成一致,即我们认为它是简洁明了的。

注:由于==比较引用而不是对象本身,因此这不适用于Java 。在Java中,您应该使用myStringVar.equals("myString")


3
至少在Java中,不要使用==它,因为它仅比较对象引用。也就是说,解决方案的+1(惯例)通常定义了“正确”的工作方式。
Michael K

感谢您指出这一点!我已经更新了答案:)
CodeART

@CodeWorks:我想你错过了迈克尔的观点。另外,它不是Java,而是Java。
阿马拉

问题是:“但是什么是最佳/标准做法?为什么?” 我的回答是,标准和最佳实践在一个组织之间会有所不同。你不同意吗?
CodeART 2012年

@CodeWorks:没有人可以不同意CodeWorks。但是每个人都可以同意,这myStringVar == "myString"在Java上是一个非常糟糕的主意(除非您绝对确定myStringVar是实习生)。
2012年

0

我认为您是对的,因为它取决于变量的空语义。如果您不希望它为null,也不必检查和处理它,则第一种形式更干净。

也就是说,与其嵌入字符串文字,不如选择一个更好的选择:

private final String MY_STRING = "myString";
if(MY_STRING).equals(myStringVar);

特别是如果有可能在多于一个的位置使用字符串。


2
-1:实际上不是更好;杂乱无章的东西通常可以忽略不计
amara 2012年

@sparkleshy-不同意,您确实不希望通过代码逻辑散布字符串文字。正如原始答案中提到的那样,如果字符串文字在多于一个的地方使用,那么我肯定会说重构它们。
本杰明·伍顿

这么说,您必须彻底diss python,因为在python中,标识符基本上是字符串文字。而且我认为我们都必须同意python是一种很好的语言。
Amara
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.