我从别人听到null == object
是优于object == null
检查
例如:
void m1(Object obj ) {
if(null == obj) // Is this better than object == null ? Why ?
return ;
// Else blah blah
}
是否有任何理由或这是又一个神话? 感谢帮助。
我从别人听到null == object
是优于object == null
检查
例如:
void m1(Object obj ) {
if(null == obj) // Is this better than object == null ? Why ?
return ;
// Else blah blah
}
是否有任何理由或这是又一个神话? 感谢帮助。
这可能是从C学到了一种习惯,以避免这类错字(单=
而不是双==
):
if (object = null) {
把固定在左侧的约定==
因为Java要求在一个表达式不是在Java中真正有用的if
计算为boolean
值,所以除非常量是一个boolean
,你会得到一个编译错误无论哪种方式,你把论点。 (如果它是一个布尔值,你不应该使用==
反正...)
正如其他人所说,这是由C教训,避免错别字一种习惯 - 虽然连用C,我期望在足够高的警告级别,体面的编译器发出警报。 作为Chandru说,反对在Java中零这样的比较,如果你使用类型的变量,只会导致问题Boolean
(你在示例代码不是)。 我会说这是一个非常罕见的情况,一个是它没有它的价值改变了你写的代码在其他地方的方式。 (我不会理会,即使在这种情况下扭转操作数;如果我想清醒地考虑倒车他们,我敢肯定,我可以算等号。)
什么也没有被提及的是,很多人(当然我自己在内)发现if (variable == constant)
形式可读性更强-这是表达自己的更自然的方式。 这是有原因的, 不要盲目复制约定由C.你应该总是假设什么可以在一个环境中是有用的是另一种有用的前质疑的做法(如你在这里做什么:)。
这不是用Java(1.5+)多值的除了当对象的类型是Boolean
。 在这种情况下,这仍然是很方便的。
if (object = null)
不会导致Java编译失败1.5+如果对象是Boolean
,但会抛出一个NullPointerException
运行时。
在Java中,没有很好的理由。
一对夫妇其他的答案都声称,这是因为你可以不小心让它分配,而不是平等。 但在Java中,你必须有在如果一个布尔值,因此这一点:
if (o = null)
不会编译。
唯一的一次,这可能在Java中无论是如果变量是布尔:
int m1(boolean x)
{
if (x = true) // oops, assignment instead of equality
这也密切相关:
if ("foo".equals(bar)) {
如果你不希望处理的NPE这是方便:
if (bar!=null && bar.equals("foo")) {
这招应该防止v = null
那种错别字。
但Java只允许布尔表达式为if()
条件,使招没有太大的意义,编译器会发现那些错别字呢。
它仍然是C / C ++代码有价值的伎俩虽然。
出于同样的原因,你做的在C; 分配是一个表达式,所以你把文字置于左侧,这样你不能覆盖它,如果你不小心用=
代替==
。
这是谁喜欢有左侧恒人。 在具有多数情况下在左侧的常数将防止抛出NullPointerException(或具有另一nullcheck)。 例如字符串equals方法也做一个空检查。 具有恒定的左侧,将让你从编写额外的检查。 其中,以另一种方式也将在后面进行。 其左边的空值只是被一致。
喜欢:
String b = null;
"constant".equals(b); // result to false
b.equals("constant"); // NullPointerException
b != null && b.equals("constant"); // result to false
用下面的代码进行比较:
String pingResult = "asd";
long s = System.nanoTime ( );
if ( null != pingResult )
{
System.out.println ( "null != pingResult" );
}
long e = System.nanoTime ( );
System.out.println ( e - s );
long s1 = System.nanoTime ( );
if ( pingResult != null )
{
System.out.println ( "pingResult != null" );
}
long e1 = System.nanoTime ( );
System.out.println ( e1 - s1 );
null != pingResult
325737
pingResult != null
47027
因此, pingResult != null
是赢家。
由于它的交换律 ,之间的唯一区别object == null
和null == object
(在尤达版 )是认知性质的:代码是如何读取和读者消化。 我不知道确切的答案,虽然,但我知道我个人比较喜欢比较的对象,我检查到别的东西,而不是比较我检查对象别的东西 ,如果让任何意义。 先从题目,然后比较它的价值。
在其他一些语言中,这相比风格更加有用。
为了防止一般缺少符号“=”安全防范虽然,我觉得写null == object
是一个误导行为防御性编程 。 围绕这个特殊的代码更好的方法是保证用JUnit测试的行为。 请记住,缺少的可能错误的“=”是不依赖于方法的输入参数 - 你是不依赖于正确的使用这个API的其他人 - 所以JUnit测试是完美的针对安全防范代替。 反正你会想要写JUnit测试来验证行为; 缺少“=”自然范围之内。