如何解决Sonarqube报告的Java String实例化问题

时间:2015-05-13 12:15:16

标签: java sonarqube

我在代码中使用了以下语句来声明一个空字符串。

String temp = "";

这导致Sonarqube提出了一个问题。 那么解决这个问题的有效方法是什么? 以下声明是一个好方法吗?

$('[data-src^="{{"][data-src$="}}"]').each(function() {
    $(this).attr('src', $(this).attr('data-src'));
});

4 个答案:

答案 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,了解附加的性能问题以及如何处理它们。