测试的价值是多少!“”。equals(someString)

时间:2011-03-17 20:49:07

标签: java coding-style

在我一直在努力熟悉的项目中,我遇到了一个看起来像这样的方法:

public boolean testString(String string){
    return string != null && !"".equals(string);
}

以这种方式测试字符串空虚的价值是什么,而不是先使用变量?我理解为什么我们在C中看到常量优先(Yoda语法),但有没有理由在Java中使用方法调用?

注意:我确实理解NullPointerException,这在这个实例中是不可能的。在这种情况下,我正在寻找以这种方式做到这一点的价值。

9 个答案:

答案 0 :(得分:4)

在这种情况下它没什么区别,因为它已经测试了null。通常你这样做是为了确保你不会在null引用上调用成员(导致NullPointerException),即

"test".equals(myString)

永远不会抛出空指针异常,而

myString.equals("test")

如果myString为null。所以基本上,第一个测试确保它是一个字符串(非空)并且它等于“test”。

答案 1 :(得分:1)

使用"constant string".equals(variable)的通常原因是,即使variablenull(与variable.equals("constant string")不同),这也能正常运行。但是,在您的情况下,由于您在短路布尔测试中测试string != null,因此完全是风格(或习惯)的问题。

答案 2 :(得分:1)

对于两个字符串而言并不重要,但如果涉及非final类型,则可以进行微优化。

如果左侧是未覆盖的混凝土类型,则调度变为静态。

考虑JIT必须为

做些什么
Object o;
String s;

o.equals(s)

VS

s.equals(o)

首先,JIT必须找到所使用的实际equals方法,而在第二种方法中,它知道它只能通过String.equals

我养成了做的习惯

"constant value" == variableName

在其他语言中,因为这意味着如果我错误输入=而不是==,代码将无法解析。 当我学习Java时,我保留了订单偏好。

答案 3 :(得分:0)

如果他们这样做了:

!"".equals(string);

然后他们避免了NullPointerException的可能性,这非常聪明。但是,他们在此条件之前检查是否为空,这在技术上是没有必要的。

答案 4 :(得分:0)

是否运行任何像checkstyle这样的工具?如果是,将变量放在第一位将导致checkstyle失败。另一个原因是,如果你将空字符串放在第一位,那么如果变量为null则会消除获得null异常的可能性,因为表达式将始终计算为false。如果您先将变量放在第一位且变量为null,则会抛出异常。

答案 5 :(得分:0)

这不仅仅是编码员的偏好。如果方法的目的只是检查字符串是不是一个空字符串(不关心它是否为空),那么首先使常量避免NullPointerException是有意义的。 例如此方法将返回布尔结果。如果string为null,则为false。

public boolean testString(String string){
    return !"".equals(string);
}

虽然如果string为null,这个可能会抛出运行时异常

public boolean testString(String string){
    return !string.equals("");
}

答案 6 :(得分:0)

不,这是不自然的,更难阅读。它会触发大多数读者的暂停,并可能浪费在stackoverlow.com上消耗大量资源。

(最好还是使用string.isEmtpy()

没有固定的规则,有时这更容易阅读

if( null != foobar(blahblahblah, blahblahblah, blahblahblah) )

if( foobar(blahblahblah, blahblahblah, blahblahblah) != null )

答案 7 :(得分:0)

这个问题可以在很多层面上得到解答:

  1. 这个例子是什么意思?

    正如其他答案所解释的那样,!"".equals(str)测试str是否为非空字符串。通常,<stringLiteral>.equals(str)成语是一种测试字符串的简洁方法,该字符串在没有显式测试的情况下处理null情况。 (如果strnull,则表达式的计算结果为false

  2. 这个特例是最佳做法吗?

    一般没有。 !"".equals(str)部分处理str为空的情况,因此前面的空测试是多余的。

    但是,如果绝大多数情况下str为空,则此用法可能会更快。

  3. 从代码风格的角度来看,有什么更好的方法呢?

    return "".equals(str);

    return str != null && !str.isEmpty();

    但是,第二种方法不适用于1.6之前的Java版本...因为isEmpty()是最近的API扩展。

  4. 这样做的最佳方式是什么?

    我的直觉是return str != null && !str.isEmpty();将是最快的。 String.isEmpty()方法是作为单行测试实现的,并且足够小以至于JIT编译器将内联它。 String.equals(Object)方法要复杂得多,而且太大而无法内联。

答案 8 :(得分:-1)

MiškoHevery(见他在youtube上的视频)称这种类型的矫枉过正的“偏执编程”: - )

可能在此视频中: http://www.youtube.com/watch?v=wEhu57pih5w

另见:http://misko.hevery.com/2009/02/09/to-assert-or-not-to-assert/