在我一直在努力熟悉的项目中,我遇到了一个看起来像这样的方法:
public boolean testString(String string){
return string != null && !"".equals(string);
}
以这种方式测试字符串空虚的价值是什么,而不是先使用变量?我理解为什么我们在C中看到常量优先(Yoda语法),但有没有理由在Java中使用方法调用?
注意:我确实理解NullPointerException,这在这个实例中是不可能的。在这种情况下,我正在寻找以这种方式做到这一点的价值。
答案 0 :(得分:4)
在这种情况下它没什么区别,因为它已经测试了null。通常你这样做是为了确保你不会在null引用上调用成员(导致NullPointerException),即
"test".equals(myString)
永远不会抛出空指针异常,而
myString.equals("test")
如果myString为null。所以基本上,第一个测试确保它是一个字符串(非空)并且它等于“test”。
答案 1 :(得分:1)
使用"constant string".equals(variable)
的通常原因是,即使variable
为null
(与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)
这个问题可以在很多层面上得到解答:
这个例子是什么意思?
正如其他答案所解释的那样,!"".equals(str)
测试str
是否为非空字符串。通常,<stringLiteral>.equals(str)
成语是一种测试字符串的简洁方法,该字符串在没有显式测试的情况下处理null情况。 (如果str
为null
,则表达式的计算结果为false
。
这个特例是最佳做法吗?
一般没有。 !"".equals(str)
部分处理str
为空的情况,因此前面的空测试是多余的。
但是,如果绝大多数情况下str
为空,则此用法可能会更快。
从代码风格的角度来看,有什么更好的方法呢?
return "".equals(str);
或
return str != null && !str.isEmpty();
但是,第二种方法不适用于1.6之前的Java版本...因为isEmpty()
是最近的API扩展。
这样做的最佳方式是什么?
我的直觉是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/