对字符串文本调用等于

2022-09-01 17:59:15

我只是整理了一下我的代码,有这样一段:

String saving = getValue();
if(saving != null && saving.equals("true")){
   // do something
}

然后我想到反过来做,以摆脱检查:null

if("true".equals(saving)){
   // do something
}

它肯定有效,但这样做安全吗?我的意思是字符串文本存储在公共池中,而由 创建的字符串对象存储在堆上。但是常量池中的字符串也是对象,对吧?new

但这似乎仍然不是正确的做法,即使它使代码更短。


答案 1

为了确保这个问题有一套完全平衡的答案,我想发表一个不同的意见。

我认为这种机制是愚蠢的。

如果你有一个你应该知道,一旦它发生 - 隐藏它只会推迟它的发现。如果不是例外,请将其替换为其他内容。nullnull

采用这种方法将通过所谓的防御性编程来强化您的代码,在这种编程中,您的错误会尽快被发现,而不是在一切都崩溃之前被掩盖。

总之 - 是你的朋友。您应该使用它来查找代码中的错误。使用 Empty 对象非常容易,例如,一旦您确定 不是异常。NullPointerExceptionCollections.emptySet()null

出于习惯使用尤达技术将不可避免地隐藏您无意隐藏的错误。使用它会更早地暴露错误。对我来说,这是不使用它的充分论据 - 永远。

对我来说 - 使用

if(saving != null && saving.equals("true")){

意味着我实际上想允许,这是一个可以接受的情况 - 使用savingsnull

if("true".equals(saving)){

只是以一种可能成为坏习惯的方式隐藏了这种刻意的选择。


答案 2

这是安全的 - 正如您所看到的,这是避免空指针的好方法。

你提到了字符串的使用。许多java静态代码分析工具会建议始终使用文本而不是。newnew String("foo");

编辑:

如果您愿意,您甚至可以只使用:

if (Boolean.valueOf(saving)) {
    ...
}

根据文档,通过将返回 。nullfalse