如果我尝试在java中对空字符串执行.equals()
,则会抛出空指针异常。我想知道,如果我试图比较一个字符串是否等于某个常量字符串,我可以执行以下操作:
MY_CONSTANT_STRING.equals(aStringVariable)
我知道它会起作用,但这只是非常糟糕的代码吗?
答案 0 :(得分:20)
这是一个标准的Java习语,开玩笑地称为Yoda condition。
我个人更喜欢明确地处理null case,但是Yoda方式经常被使用,任何有经验的Java程序员应该能够立即理解正在发生的事情。这很好用。
答案 1 :(得分:6)
这只是非常差的代码吗?
不,这是许多人编写声明以避免NPE的方式。
答案 2 :(得分:5)
你得到的很好。甚至可以使用String文字。
if( "value".equals(variable) ) {
...
如果您不喜欢这样,您可以始终显式检查null
和相等,并将两个检查与&&
结合使用。操作员的短路将确保您永远不会获得NPE。
if( (variable != null) && variable.equals("value") ) {
...
答案 3 :(得分:1)
我会保留“CONSTANT.equals(possibleNull)”代码而不使用null测试,只要它是一个正常的条件,变量可以为null - 例如因为它刚出来的属性映射。
同样,你可以在实例检查中不检查null,例如:
Food dinner = map.get("dinner");
if (dinner instanceof Soup) {
((Soup)blah).eat();
} // We don't care if it is a Fish or null
但是如果你真的没想到null,你应该在一个单独的if-test中明确检查它,并适当地处理它。通常最好早点而不是稍后捕获这些数据错误。
答案 4 :(得分:0)
不,通常是为了避免NPE。但是,我通常更喜欢对null进行显式检查。
答案 5 :(得分: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))
你所谓的恒定MIGHT停止不变。可能会在将来的某个时间从配置文件中读取它。