【问题标题】:Way to check if a thread is null or not (in Java), does operand position makes difference检查线程是否为空的方法(在Java中),操作数位置是否有所不同
【发布时间】:2020-01-30 09:47:51
【问题描述】:

注意:我经历了这些,但没有得到答案Best way to check for null values in Java?(obj == null) vs (null == obj)?

我正在研究这个Android [Java] 官方文档关于Background Tasks -> Run code on a thread pool thread -> Interrupt running code,示例中的null检查代码为:

if (null != thread) {
    thread.interrupt();
}

这与我们通常看到/使用的不同:

if (object != null) {
    //do something;
}

所以,我的问题是:

如果我们写“null != thread”而不是“thread != null”或者 Google 官方文档只是随机交换操作数而没有任何好处,这有什么不同(比如帮助避免空指针或其他东西)吗?

编辑:

  1. 我问的是 != 而不是 ==。在 == 的情况下,程序员可以 做赋值(=)而不是比较(==)。但事实并非如此 在 !=
  2. 我说的是 Java 而不是 C 语言。所以,那个任务比较混淆不适用于此处。

【问题讨论】:

  • 这是一个非常奇怪的观察,也是一个非常奇怪的问题 :) 但我认为没有任何区别。
  • 注意==!=是对称关系,所以顺序没有任何区别。
  • @a_local_nobody 实际上,当我阅读一个由更好的程序员(我的假设是因为作者在这里为谷歌工作)编写的程序时,我看到了任何不同的编码风格,我想知道我可能在做什么错了……
  • @GyroGearless 这可能值得回答:D
  • 另请注意,null != foo 的用法有时更受经验丰富的 C 程序员的青睐,在这种情况下,很容易意外写入 foo=null(赋值)而不是 foo==null(比较)。在 java 中没有严格的理由这样做。

标签: java android if-statement nullpointerexception null


【解决方案1】:

没有语义差异

if (null != thread) {
    thread.interrupt();
}

为什么 Google 的其他聪明人以这种落后的方式编写空检查仍然是猜测。我同意你的观点,它比自然的thread != null 更难阅读。

倒写没有任何好处。语义完全相同。

if 条件的倒写被称为 Yoda 条件。尤达条件存在争议,有人说在某些情况下它们在某些编程语言(如 C)中占有一席之地。如果是== 而不是!= 进行比较,您可以阅读先前链接的副本中的一些参数(我重复底部的链接)。在 Java 中,在以下情况下可能会有一个广受欢迎的论点:

boolean b;
if (b == false) {
    // Do something
}

想象一下来自 Pascal 或其他编程语言的程序员使用单个 = 进行比较并错误地将单个 = 放在这里。它将含义更改为将false 分配给b 并且从不执​​行条件代码。所以争论说通过编写false == b,编译器会为你捕捉到这样的错误,这是一个明显的优势。然而:

  1. 无论如何,大多数编译器和 IDE 都会发现错误。例如,如果我在上面的 if 语句中添加一个 =,我的 Eclipse 会说

    可能的意外分配代替了比较。一个条件 表达式不应简化为赋值

  2. if 语句通常以以下方式编写,排除任何关于尤达条件的有意义的辩论,并且通常也被推荐:

    if (! b) {
        // Do something
    }
    

所以回到你的问题,我的猜测是:Google 的一名程序员有编写尤达条件的习惯,例如 null == thread,并通过错误的类比将其扩展到 null != thread

那么!= 操作数的顺序从不带有任何语义吗?

为了完整起见,当我说thread != nullnull != thread 具有相同的语义时,我指的是引用的这段代码。例如在someObj.foo() != anotherObj.bar() 的情况下,该顺序强加了两个方法调用的顺序。如果这两种方法都具有以某种方式干扰的副作用,则在某些情况下应用这些副作用的顺序可能会有所不同。

链接

【讨论】:

    猜你喜欢
    • 2018-01-15
    • 2014-07-04
    • 2016-07-28
    • 1970-01-01
    • 2018-10-16
    • 1970-01-01
    • 2011-08-21
    • 1970-01-01
    • 2015-01-11
    相关资源
    最近更新 更多