Java等于()排序

如果我尝试在java中的空字符串上执行.equals() ,则会抛出空指针exception。 我想知道,如果我想比较一个字符串是否等于某个常量字符串,我可以执行以下操作:

 MY_CONSTANT_STRING.equals(aStringVariable) 

我知道它会起作用,但这只是非常糟糕的代码吗?

这是一个标准的Java习语,开玩笑地称为Yoda条件 。

我个人更喜欢明确地处理null情况,但Yoda方式使用了很多,任何有经验的Java程序员应该能够立即理解发生了什么。 这很好用。

这只是非常糟糕的代码吗?

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

你得到的很好。 甚至可以使用String文字。

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

如果您不喜欢这样,您可以始终显式检查null和相等,并将两个检查与&&结合使用。 操作员的短路将确保您永远不会获得NPE。

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

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

类似地,你可以逃避在instanceof-checks中不检查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中明确检查它,并适当地处理它。 通常最好早点而不是后来捕获这些数据错误。

不,通常是为了避免NPE。 但是,我通常更喜欢对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)) 

你所谓的恒定MIGHT停止不变。 可能会在将来的某个时间从配置文件中读取它。