我在代码中使用了以下语句来声明一个空字符串。
String temp = "";
这导致Sonarqube提出了一个问题。 那么解决这个问题的有效方法是什么? 以下声明是一个好方法吗?
$('[data-src^="{{"][data-src$="}}"]').each(function() {
$(this).attr('src', $(this).attr('data-src'));
});
答案 0 :(得分:1)
声纳是正确的,因为你不应该使用new String()
。初始化为空字符串(String temp = ""
)更好。但是如果在任何情况下都不使用空字符串的值,则不应将变量初始化为任何内容。您应该只将变量初始化为您打算使用的值。
这是完全的,通常是可以接受的:
String temp;
您的条件逻辑应涵盖所有转让案例。
答案 1 :(得分:0)
/**
* Initializes a newly created {@code String} object so that it represents
* an empty character sequence. Note that use of this constructor is
* unnecessary since Strings are immutable.
*/
public String() {
this.value = new char[0];
}
String类的源代码描述使用此构造函数是不必要的。每次在堆中创建新对象。更好的是使用字符串池。
答案 2 :(得分:0)
第二个例子是正确的。
使用
String temp = "";
答案 3 :(得分:0)
是的,声纳是正确的。使用new String()
几乎不是一个好主意。
原因是,JVM缓存了Strings,因此您不需要每次都在堆上创建一个新对象(这就是为什么有时错误地将字符串与==
进行比较的原因 - 它们都指向堆上的相同缓存实例。
自己构建一个String将绕过内置缓存,并可能导致性能问题。如果您只需要一个空字符串,只需指定它:
String temp = "";
或者,如果您只是想声明一个字符串,因为您想稍后分配它,只是不要为它指定任何东西!
String temp;
if(condition()) {
temp = "hello!";
} else {
temp = "bye!";
}
如果您计划在循环中连接空字符串,请阅读this question,了解附加的性能问题以及如何处理它们。