我只是整理了一下我的代码,有一段:
String saving = getValue();
if(saving != null && saving.equals("true")){
// do something
}
然后我想用另一种方式来做,以摆脱对null
的检查
if("true".equals(saving)){
// do something
}
它肯定可以工作,但是这样做是安全的吗?我的意思是,字符串文字存储在一个公共池中,而由new
创建的字符串对象存储在堆中。但是常量池中的字符串也是对象,对吧?
但这看起来仍然不是正确的做法,即使它使代码更短。
发布于 2013-12-05 04:28:25
这是安全的-正如你所看到的,这是避免空指针的好方法。
您提到了对字符串使用new
。许多java静态代码分析工具建议始终使用文本而不是new String("foo");
。
编辑:
如果你愿意,你甚至可以使用:
if (Boolean.valueOf(saving)) {
...
}
根据docs,传递null
将返回false
。
发布于 2013-12-05 07:58:52
为了确保这个问题有一个完全平衡的答案,我想发表一个不同的观点。
我认为这种机制是愚蠢的。
如果你有一个null
,你应该在它发生的时候就知道-隐藏它只会推迟它的发现。如果null
不是异常,则将其替换为其他内容。
采用这种方法将使用所谓的防御性编程来加强您的代码,在这种编程中,您的错误会被尽快发现,而不是一直掩盖到一切崩溃。
总之-- NullPointerException
是你的朋友。您应该使用它来查找代码中的错误。一旦您确定null
不是异常,使用诸如Collections.emptySet()
之类的空对象是非常容易的。
出于习惯使用Yoda技术将不可避免地隐藏您不想隐藏的错误。而不是使用它将会更早地暴露错误。对我来说,这是不使用它的充分理由-永远不会。
对我来说-使用
if(saving != null && saving.equals("true")){
意味着我实际上希望允许savings
为null
,这是可以接受的情况--使用
if("true".equals(saving)){
只是以一种可能成为坏习惯的方式隐藏了这种刻意的选择。
发布于 2013-12-11 21:57:29
我不同意其中一些答案。有时你do想知道你的变量是否为null
。这可能表明您的代码中发生了一些不好的事情,您可能需要重新考虑您的逻辑。
我不喜欢做if ("someString".equals(myString));
,因为我 do 想知道myString
是否是null
,也许可以处理它,或者改变我的逻辑以防止类似的情况。
假设你有一个对象数组,由于一些bug而计算错误:
myStrings = {..., ..., null, null, ...};
然后,您需要在数组的对象上执行一些操作,您将拥有:
if ("myString".equals(myObjArray[i])) { ... }
您不会得到NullPointerException
,并且您可能认为您在数组中的所有对象上执行了该操作,并且您永远不会知道您错误地计算了它,因为您隐藏了异常。然而,如果你有:
if (myObjArray[i].equals("myString")) { ... }
您将得到一个NPE,您将知道数组中有问题,您可能希望修复它或以另一种方式处理它。
https://stackoverflow.com/questions/20385179
复制相似问题