Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 提取大量字符串文字是个好主意吗?_Java_String_Memory Management_Constants_Static Analysis - Fatal编程技术网

Java 提取大量字符串文字是个好主意吗?

Java 提取大量字符串文字是个好主意吗?,java,string,memory-management,constants,static-analysis,Java,String,Memory Management,Constants,Static Analysis,在我正在处理的遗留代码库中,有大量的字符串文本。其中许多是重复的。例如,字符串“userID”用于500个位置。可能有一千个这样的文字被重复使用。IntelliJ Idea静态代码分析建议我将它们提取为常量。如果IDE自动为我进行重构,而不需要我输入一行代码,我应该这样做吗 一般来说,提取许多重复的字符串文字作为常量是一个好主意吗?这显然将避免重复,将提供单点访问、声明等 然而,当被访问时,这些文字中的一些出现在画面中。如果我将所有文字声明为常量(static final),那么所有这些文字都将

在我正在处理的遗留代码库中,有大量的字符串文本。其中许多是重复的。例如,字符串“userID”用于500个位置。可能有一千个这样的文字被重复使用。IntelliJ Idea静态代码分析建议我将它们提取为常量。如果IDE自动为我进行重构,而不需要我输入一行代码,我应该这样做吗

一般来说,提取许多重复的字符串文字作为常量是一个好主意吗?这显然将避免重复,将提供单点访问、声明等

然而,当被访问时,这些文字中的一些出现在画面中。如果我将所有文字声明为常量(static final),那么所有这些文字都将一起加载。在这种情况下,将所有这些文本声明为常量是一个好主意吗?在这种情况下,您能提供一些垃圾收集、内存空间预防措施的指针吗?在这种情况下使用的最佳实践是什么

注意:我知道字符串文字是被拘留的。所以我不认为在最坏的情况下我会保存任何内存。另外,jdk 7似乎将把这些字符串放在堆中,而不是permgen中。我看到了一个和我一样的,但感觉不一样。所以把它贴在这里

谢谢

  • 所有字符串文本都会自动插入。从JDK7+,当定义它们的类(实际上是加载了定义字符串文字的类的类加载器)得到GCed时,它们将被GCed(前提是没有其他类引用它(尽管这种情况很少发生).从节省内存的角度来看,将它们设置为静态的和最终的,并将它们放在一个公共类中确实是无用的,但从设计的角度来看是有用的,因为它将提供一个单一的访问点

  • JVM中的所有类都共享相同的字符串文本。因此,不会有新字符串。实际上,将它们放在一个类中并从该类访问它们可以使代码更结构化/更可读


  • 我的建议是,不要修补遗留代码,除非它会带来很大的不同。取舍由您选择。:p

    可能。这是我的意见(提示),但如果需要使用某个特定字符串,您至少可以减少出错的次数。这也让您有机会为该字符串的实际含义添加上下文。同意
    不要修补遗留代码…
    commentjust;@Atul将字符串声明为常量的真正原因是为了减少由于拼写错误而导致编码错误的可能性,这样做本质上可以让编译器强制要求您在任何地方都使用相同的字符串;还可以让您轻松地一次性更改字符串,并为字符串命名具有更多语义意义的名称(还允许您为具有相同值但用途不同的字符串提供上下文)不过,内存使用方面的差异,以及实习带来的差异。如果遗留代码有效,没有理由进行此类更改。同意遗留代码部分。但如果IDE一次性自动重构此提取常量,这仍然是一个坏主意吗?@Atul最有可能。现在进行更改,并正确执行,可能比简单的查找+替换要复杂得多。例如,您希望验证每次出现“userId”实际上意思是一样的。如果一个是数据库列名,另一个是不相关但巧合相同的,比如说,配置文件中的键,那么当它们在语义上不同时,不小心将它们合并到同一个常量中,可能会使事情变得更糟。您必须分析所有这些。@Atul-要添加到Jason的c注意,可能有多个不相关的
    “userid”
    字符串。也就是说,明天客户可能会要求您将其更改为
    “username”
    ,那么实际搜索并用username替换正确的userid字符串将出现问题。。