2010-08-05 76 views
6

如果我尝试在java中的空字符串上执行.equals(),则会抛出空指针异常。我想知道,如果我想比较,如果一个字符串等一些常量字符串,我可以做到以下几点:Java等于()排序

MY_CONSTANT_STRING.equals(aStringVariable) 

我知道它会工作,但是这只是真的很差的代码?

回答

16

这是一个标准的Java习惯用法,开玩笑地称为Yoda condition

就我个人而言,我更喜欢明确地处理空案例,但Yoda方式使用了很多,任何有经验的Java程序员都应该能够理解立即发生的事情。这很好用。

+0

+1因为我刚刚了解了尤达的条件,感谢这个答案。 http://stackoverflow.com/questions/2349378/new-programming-jargon-you-coined/2430307#2430307 – 2010-08-05 20:02:52

4

你有什么好的。甚至可以使用String文字。

if("value".equals(variable)) { 
    ... 

如果你不喜欢,你总是可以显式检查null和平等,这两个检查与&&结合。运营商的短路将确保你永远不会得到NPE。

if((variable != null) && variable.equals("value")) { 
    ... 
+2

如果你希望减少混乱,变量!= null的括号是可选的。 – 2010-08-06 03:49:45

5

这只是真的很差的代码?

不,这是许多人编写声明以避免NPE的方式。

0

不,通常这样做是为了避免NPE。但是,我通常更喜欢对null进行显式检查。

1

只有在变量可能为空的正常情况下,例如因为它刚刚出现属性映射,我才会保留“CONSTANT.equals(possibleNull)”代码而不进行空测试。

同样你可以不检查中的instanceof的检查空脱身 - 样:

Food dinner = map.get("dinner"); 
if (dinner instanceof Soup) { 
     ((Soup)blah).eat(); 
} // We don't care if it is a Fish or null 

但如果你真的没想到空,你应该明确地在一个单独的,如果测试检查的是,并妥善处理。早期发现这些数据错误通常会更好,而不是晚些时候。

0

如果你关心你的代码的质量,编写一个助手类,它需要照顾平等的测试:

public class ObjectHelper { 
    public static boolean testEquality(Object o1, Object o2) { 
     if (o1 == null && o2 == null) return true; 
     if (o1 == null) return false; 
     return o1.equalts(o2); 
    } 
} 

然后使用它是这样的:

if (ObjectHelper.testEquality(aStringVariable, My_CONSTANT_STRING)) 

你所谓的持续不断地停下来。它可能会在未来某个时间从配置文件读取。

+0

Java 7有一个内建帮助方法['java.util.Objects.equals(..)'](http://docs.oracle.com/javase/7/docs/api/java/util/Objects.html# equals(java.lang.Object,%20java.lang.Object))。 – 2012-12-20 10:05:52