2

有些人,通常是那些来自 C 背景的人,他们的测试代码null如下:

if (null == someVar)

相信“正常”的风格

if (someVar == null)

可能不小心被编码为

if (someVar = null)

这会无意中分配a而null不是testnull

但是,如果发生错误编码,例如if (someVar = null)

  1. 为了编译,唯一的类型someVar可以是Boolean
  2. 如果它编译并被执行,它会抛出一个NullPointerException


为什么这些人没有意识到“防御”(即螺旋球)风格根本没有帮助,因为错误编码要么无法编译,要么无法运行!?

顺便说一句,就性能而言,编码if (null == someVar)实际上执行起来稍微慢一些——准确地说是一条指令更慢。原因是null必须将其压入堆栈进行比较,而“正常”样式使用特殊的“is null”指令。


我知道...这不是一个问题。更多的是吐槽。但我想把它放在那里。如果您也认为他们“缺乏洞察力”,请投票。

但是,如果您知道答案,我想听听。

4

3 回答 3

8

因为他们从 C 中带回了这个习惯,其中

if (someInteger = 0)

是有效代码,因为 C 没有布尔值,只有整数(0 为假,其他整数为真)。

if (somePointer = NULL)

也是有效的,因为在 C 中,NULL 为 0。

因此,在 C 中,这种结构是有意义的。

请注意,在 Java 中,执行此操作时也会出现此错误

if (b = true)

代替

if (b == true)

当然,优秀的 Java 开发人员永远不会编写上述内容,而是会使用

if (b)
于 2012-12-24T10:50:22.343 回答
3

写作没有问题if (null == someVar),为什么不呢?对于从 C/C++ 背景中采用此约定的人来说,为 Java 保持相同的约定并不是一个坏主意。特别是如果他们仍在使用 C/C++ 编写;否则他们最终不得不对两种语言使用两种不同的约定,而不是使用一种通用的约定。

简单的习惯问题,没有任何真正的不良副作用。

于 2012-12-24T10:54:25.420 回答
0

有时以这种方式定义变量范围很有用:

if(std::shared_ptr<X> p = q.lock())
{
    // q is valid, I can now use p.

    p->DoSomething();
}

q.lock() != 0 计算结果为 TRUE。q.lock() == 0 计算结果为 FALSE。上面给出的编码风格将使意图明确。然而,这些天来编译器在发现意外分配方面非常聪明,所以它并不是真正必要的。在过去,情况并非如此。

于 2012-12-24T10:55:56.710 回答