对象== null或null ==对象?
我从别人那里听说, null == object
比object == null
检查好
例如:
void m1(Object obj ) { if(null == obj) // Is this better than object == null ? Why ? return ; // Else blah blah }
有没有什么原因,或者这是另一个神话? 感谢帮助。
这可能是从C学习的习惯,为了避免这种排字错误(single =
而不是double ==
):
if (object = null) {
将常量放在==
左边的约定在Java中并不是很有用,因为Java要求if
中的expression式求值为boolean
值,所以除非常量是boolean
值,否则会得到一个编译错误无论哪种方式,你把论据。 (如果它是一个布尔值,你不应该使用==
反正…)
正如其他人所说,这是一个从C学到的习惯,以避免错别字 – 尽pipe即使在C,我希望体面的编译器在足够高的警告水平警告。 正如Chandru所说,以这种方式与Java中的null进行比较只会导致问题,如果您使用的是Boolean
types的variables(您不在示例代码中)。 我会说这是一个非常罕见的情况,而不是一个值得改变其他地方编写代码的方式。 (即使在这种情况下,我也不会打扰操作数;如果我想清楚地考虑扭转它们,我相信我可以计算等号。)
没有提到的是,很多人(我自己也包括在内)发现if (variable == constant)
forms更具可读性 – 这是expression自己的更自然的方式。 这是不要盲目复制C的一个惯例的原因。你应该总是质疑实践(就像你在这里所做的那样),然后再假设在一个环境中可能有用的东西在另一个环境中是有用的。
这在Java(1.5+)中没有太大价值,除非对象的types是Boolean
。 在这种情况下,这仍然可以得心应手。
if (object = null)
在Java 1.5+中不会导致编译失败,如果object是Boolean
但会在运行时抛出NullPointerException
。
在Java中没有很好的理由。
其他一些答案声称,这是因为你可能会意外地将其赋值而不是平等。 但在Java中,你必须在if中有一个布尔值,所以这个:
if (o = null)
不会编译。
这在Java中唯一可能的问题是如果variables是布尔值:
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
types的错别字。
但是Java只允许布尔expression式作为if()
条件,所以这个技巧没什么意义,编译器无论如何都会发现这些错别字。
尽pipe如此,它仍然是C / C ++代码的宝贵技巧。
出于同样的原因,你用C来做; 赋值是一个expression式,所以你把文字放在左边,这样如果你不小心使用=
而不是==
,你就不能覆盖它。
那对于那些喜欢在左边持续不断的人来说。 在大多数情况下,左侧的常量将防止抛出NullPointerExceptionexception(或者有另一个空检查)。 例如,String方法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
是赢家。
以上输出不正确。 只要分别运行这两个代码块,你会得到实际的结果。 两者将采取同一时间。
还运行下面的代码:
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 );