如果我尝试在java中的空字符串上执行.equals()
,则会抛出空指针异常。我想知道,如果我想比较,如果一个字符串等一些常量字符串,我可以做到以下几点:Java等于()排序
MY_CONSTANT_STRING.equals(aStringVariable)
我知道它会工作,但是这只是真的很差的代码?
如果我尝试在java中的空字符串上执行.equals()
,则会抛出空指针异常。我想知道,如果我想比较,如果一个字符串等一些常量字符串,我可以做到以下几点:Java等于()排序
MY_CONSTANT_STRING.equals(aStringVariable)
我知道它会工作,但是这只是真的很差的代码?
这是一个标准的Java习惯用法,开玩笑地称为Yoda condition。
就我个人而言,我更喜欢明确地处理空案例,但Yoda方式使用了很多,任何有经验的Java程序员都应该能够理解立即发生的事情。这很好用。
你有什么好的。甚至可以使用String文字。
if("value".equals(variable)) {
...
如果你不喜欢,你总是可以显式检查null
和平等,这两个检查与&&
结合。运营商的短路将确保你永远不会得到NPE。
if((variable != null) && variable.equals("value")) {
...
如果你希望减少混乱,变量!= null的括号是可选的。 – 2010-08-06 03:49:45
这只是真的很差的代码?
不,这是许多人编写声明以避免NPE的方式。
不,通常这样做是为了避免NPE。但是,我通常更喜欢对null进行显式检查。
只有在变量可能为空的正常情况下,例如因为它刚刚出现属性映射,我才会保留“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
但如果你真的没想到空,你应该明确地在一个单独的,如果测试检查的是,并妥善处理。早期发现这些数据错误通常会更好,而不是晚些时候。
如果你关心你的代码的质量,编写一个助手类,它需要照顾平等的测试:
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))
你所谓的持续不断地停下来。它可能会在未来某个时间从配置文件读取。
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
+1因为我刚刚了解了尤达的条件,感谢这个答案。 http://stackoverflow.com/questions/2349378/new-programming-jargon-you-coined/2430307#2430307 – 2010-08-05 20:02:52