String.equals()参数排序

我最近在最近的回答中收到了使用以下内容的downvote:

String word = ...; if ("s".equals(word) || "y".equals(word) 

由于使用了“yoda条件”而给出了downvote。 我要求进一步解释,但没有提供。 我更喜欢这种风格以避免可能的NullPointerException

这是一种糟糕的编码风格吗? 如果是这样,为什么?

比尔·普格在Devoxx 2011上提出了这个问题。绝大多数人选择的forms是"xyz".equals(str) 。 我和比尔在一起,现在更喜欢str.equals("xyz")

Java传统的基础是我们尽可能早地发现错误。 NPE非常常见。 我们希望尽快将这些空值路由出去。

如果你期望引用可能为null ,那么我并不特别反对向后表示法。 很明显并且更容易理解可能存在带有单独的null检查的null ,但是应该很好地理解相反的顺序并且将代码与禁止null的正常情况充分区分开。

在安全性方面工作,一些容忍零容忍的漏洞就是漏洞。

尤达条件(即在比较中将变量置于常量之前)可以被认为是不好的做法,因为它使得代码行不易理解。 但是在这种特殊情况下,我会说使用Yoda条件会使代码更容易理解,因为您不必在它前面添加额外的空值检查。

请访问以下链接,了解Yoda条件|符号的含义

它不是一种“糟糕的编码风格”,它的编码方式不同。

Yoda可以用来跟踪一些语言的拼写错误,我相信-1不应该是诚实的,但这是我个人的看法。

但是Yoda可能很糟糕 ,正如这篇冗长但非常有趣的文章所解释的那样。

当天结束时,有支持者支持并反对这种表示法。

这得看情况。 如果你的程序中“word”永远不应为null,则word.equals(“s”)可能实际上更好。 如果由于某些模糊的原因,“word”将变为null,您将获得NullPointerException。 想一想。 如果你遇到exception,你就会知道出了什么问题,你可以更快找到错误并修复它。 如果程序将继续以静默方式工作,并产生错误的结果,则检测问题将更加困难。 实际上,您可能根本没有注意到存在问题。

这完全取决于。

有几个理由不这样做,但是如果你认为这是糟糕的编码风格,最终它取决于你(或者你的产品团队)。 反对它的论点是:

  • 字符串很少为空(你不应该在它们所在的地方制作API,因为人们不期望它)
  • 把你比较的价值放在第一位,这感觉很奇怪
  • 代码样式的一致性很重要,因为这种方式是例外,如果团队中的每个人都这样做,您应该这样做。

如上所述,我不认为这些论点非常强烈,也不是像你这样做的理由。 因此,最重要的是只要在一种方式上同意您的编码风格并坚持下去。

TL; DR; 这绝对是不好的编码风格NOT:D

好吧,yoda条件在非布尔值可以计算为布尔值的语言中很有用,例如

 int test = 0; if ( test ){ /* do something */ 

但这在Java中是不允许的,因此您不会遇到遗忘’=’等问题,例如

 if ( test = 2 ){ /* do something */ 

而不是test == 2

  • 编译器不会让你这样做。 因此,对于没有必要关心这个问题的人来说,yoda条件可能看起来不自然(因为他/她没有使用任何其他语言而是Java)。

这绝对不是糟糕的编码风格,看到使用它的Java代码并不常见

yoda条件是将文字放在变量前面的地方。

word.equals(“s”)读作“word equals s”

“s”.equals(单词)人类读作“s等于单词”

我们的大脑更好地阅读了第一个例子,代码更清晰。

imho使用yoda条件的唯一原因是阻止赋值,如“if(42 = i)”而不是“if(42 == i)”

你可以写

 if (word != null && (word.equals("s") || word.equals("y"))) 

代替

 if ("s".equals(word) || "y".equals(word)) 

在这种情况下,第一个永远不会导致任何NullpointerException ,但在我的观点中,在这种情况下,第二个更好,虽然它是在Yoda条件

有一个特殊情况,如果Yoda条件我没有看到任何答案中的辩护或攻击,所以我将添加它作为参考。 这是以下的风格:

  if(0 < x && x <= max) { 

Yoda是条件因为常量( 0 )在变量( x )之前。 反对Yoda条件的论点是阻碍了可读性。 对比该function等效的例子

  if(x <= max && x > 0) { 

你真的认为,非尤达变种,更具可读性吗? 我不。

为了在使用排序关系运算符(<,<=,>,> =)时的可读性,我更喜欢这些启发式的样式:

  • 使用一致的排序关系:>与> =一致,但不与<或<=; <与<=一致。
  • 首选<和<= to>和> =,默认为升序。
  • 如果使用<和<=,则在施加上限的条件之前放置对变量施加下限的条件。 如果使用>和> =,则相反。

这经常产生一个Yoda条件的下限。

有人可能会争辩说,你应该(单元)测试你的代码,以确保空值不会出现在他们不应该去的地方。 这应该避免了对yoda条件的需要。