为什么人们使用if(null == var)样式测试?

Boh*_*ian 2 java language-agnostic if-statement coding-style

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

if (null == someVar)
Run Code Online (Sandbox Code Playgroud)

相信"正常"的风格

if (someVar == null)
Run Code Online (Sandbox Code Playgroud)

可能会被意外编码为

if (someVar = null)
Run Code Online (Sandbox Code Playgroud)

这会在不经意间分配一个null,而不是测试null.

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

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


为什么这些人都没有意识到"防御性"(即螺旋球)的风格根本没有帮助,因为误编码既不会编译也不会运行!?

顺便说一句,作为性能问题,编码if (null == someVar)实际上执行起来要慢一些 - 一条指令要慢一些.原因是null必须将其推入堆栈进行比较,而"普通"样式使用特殊的"is null"指令.


我知道......不是一个问题.更多的咆哮.但是我想把它放在那里.如果你也相信他们"不那么富有洞察力",那么就要投票.

但是,如果你知道答案,我想听听.

JB *_*zet 8

因为他们从C带回了这个习惯,在那里

if (someInteger = 0)
Run Code Online (Sandbox Code Playgroud)

是有效的代码,因为C没有布尔值,只有整数(0表示假,其他整数都是真).

if (somePointer = NULL)
Run Code Online (Sandbox Code Playgroud)

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

所以,在C中,这个结构是有意义的.

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

if (b = true)
Run Code Online (Sandbox Code Playgroud)

代替

if (b == true)
Run Code Online (Sandbox Code Playgroud)

当然,一个优秀的Java开发人员永远不会写上面的内容,但会使用

if (b)
Run Code Online (Sandbox Code Playgroud)