gpt4 book ai didi

java - 比较常量等于对象或对象等于常量

转载 作者:行者123 更新时间:2023-12-05 07:41:42 25 4
gpt4 key购买 nike

关注 Java best-java-coding-practices.htm ,他们说我们需要对已知字符串常量调用 .equals 而不是 UNKNOWN 变量

String string = new Test().getString();
// always compare like this, this will never throw NPE
System.out.println("CONSTANT.equals(string):"+CONSTANT.equals(string));
System.out.println("Comparision like string.equals(CONSTANT) may throw NullPointerException");
// next statement will throw NPE
System.out.println("string.equals(CONSTANT):"+string.equals(CONSTANT));

那么 KNOWN variable 怎么样?我们是否还应该使用这种方式?

例如,如果我从服务器接收到一个对象,服务器通知该对象从不为空。
如果我想将此对象与常量进行比较

// CONS: it may return NPE if server return null (for example server do wrong) => app crash
// PRO: when we read this code, we have a mindset that object never null, if it null it is the server bug
object.equals(CONSTANT)

// CONS: When we read this code, we never know why and when object == null so it confusing.
// It not return NPE so code still running and we may have some problem with UI or logic
// PRO: it never return NPE
CONSTANT.equals(object)

如有任何建议,我们将不胜感激。对我来说,我更喜欢使用 object.equals(CONSTANT) 作为已知变量,但我的团队不喜欢。

更新我认为

CONSTANT.equals(object)

也很相似

try{
object.equals(CONSTANT)
catch(NullPointerException ex){
// don't handle or explain anything
}

最佳答案

当其中一项是常量时,将相等运算符周围的项反转的做法称为 Yoda 条件。您可能会以下列形式遇到它:

  • if( constant == variable )而不是 if ( variable == constant )
  • if( constant.equals( variable ) )而不是 if( variable.equals( constant ) )

不要使用 Yoda 条件句。这种结构不仅违反了最少惊奇原则,而且被轮奸了。

此外,这是一种“防御性编程”形式。不要进行防御性编程;相反,从事攻击性编程。阅读Trevor Jim's post Postel's law is not for you .

此外,不要仅仅因为有人称其为“最佳实践”就盲目遵循某些建议。谁说这是最佳实践?

  • 那里只有几个人吗?那么根据定义,他们无权用“最佳实践”这样的客观名称来修饰自己的主观意见。
  • 它是这个行业的大多数吗?大多数人通常是错误的。 (有些人甚至可能会说总是 错了,看 Paul Rulkens @ TEDxMaastricht 2014 )
  • 几乎是行业内的每个人吗?那么很明显,这个行业在搞groupthink .

以下是经常引用的使用 Yoda 条件句的原因,以及他们的反驳:

  • 所谓的原因#1
    • 声明:它会捕获意外使用赋值运算符的地方。
    • 反驳:这种意外使用应该是不可能的,因为如果您尝试这样做,您的编译器或 IDE 应该会发出警告。如果您没有收到警告,那么您还有其他更大的问题需要解决,即使用错误的编程语言、使用错误的 IDE,或者在没有先弄清楚如何启用所有警告的情况下尝试编写代码。
  • 所谓的原因#2
    • 声明: 即使变量意外碰巧是 null 也能正常工作.
    • 反驳: 不行,不行;它默默地失败了。如果您遵循攻击性编程,“它有效”的定义是它必须在给定有效输入时产生正确的结果,并且在给定无效输入时必须故意失败。因此,有两种可能性:要么变量可能合法地是 null ,或者它可能不会。
      • 如果变量合法地是null ,然后明确检查 null .
      • 如果变量不是null , 然后编写代码,使其在变量实际上是 null 的情况下不会失败。 .

关于java - 比较常量等于对象或对象等于常量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45211817/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com