性能 - 巨大的字符串常量在多个类文件中重复

时间:2014-06-19 06:44:02

标签: java java-ee sonarqube

我正在获得声纳vilation性能 - 巨大的字符串常量在多个类文件中重复。

我得到这个的原因是什么? 如何解决这个问题?

这是代码

public static final String GET_CO_ADMIN_GRID_DTLS ="A 30 line huge query";

4 个答案:

答案 0 :(得分:2)

这是因为final关键字。最后的领域也进入了参考类。

大型String常量在多个类文件中重复。这可能是因为final字段被初始化为String常量,并且Java语言要求将对来自其他类的final字段的所有引用内联到该类文件中。有关JDK中此错误发生的描述,请参阅JDK错误6447475,以及解析它如何将JDK的大小减少1兆字节。

我们需要从该字符串中删除final关键字....

答案 1 :(得分:2)

Gowtham的答案是正确的。创建一个常量类并不能解决问题

// creating the constants class like this would lead into duplication of the huge string assigned to FOO
// class A and B would also contain the huge string, after compilation
class C {
    public static final String FOO = "HUGE STRING";
}

class A {
    public void f() {
        String c = C.FOO;
    }
}

class B {
    public void f() {
        String c = C.FOO;
    }
}

创建像上面提到的错误报告中提出的常量类http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6447475,避免重复使用大字符串

class C {
    public static final String FOO;
    static {
        FOO = "BAR";
    }
}

答案 2 :(得分:2)

解决方案:性能 - 在多个类文件中重复使用大量字符串常量。

1.将该类声明为final,将该字段设为public static final并指定静态块内部 2.Dont忘记声明私有构造函数,否则声纳将显示"实用程序类不应该是公共或默认构造函数(MAJOR问题)"。

public final class QueryConstants {
/**
 * Default Constructor.
 */
private QueryConstants(){
    //
}
public static final String COMMON_SELECT;
static {
    COMMON_SELECT = "Your Query Here";
}

答案 3 :(得分:1)

如果字符串常量相同,则创建一个常量文件并将该常量放在那里。在多个类文件中使用该常量。像:

Constants.CONSTANT_1