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停止不变。 可能会在将来的某个时间从配置文件中读取它。