Java等于()排序

时间:2010-08-05 19:58:47

标签: java string

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

MY_CONSTANT_STRING.equals(aStringVariable)

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

6 个答案:

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