提取大量字符串文字是个好主意吗?
Is extracting a large number of String literals a good idea?
在我处理的遗留代码库中,有大量的字符串文字。其中很大一部分是重复的。例如,字符串 "userID" 在 500 个地方使用 say。可能有一千个这样的文字被重复使用。 IntelliJ Idea 静态代码分析表明我将它们提取为常量。如果 IDE 自动为我进行此重构,而无需我输入一行代码,我应该这样做吗?
一般来说,提取许多这样的重复字符串文字作为常量是个好主意吗?这显然会避免重复,将提供单点访问、声明等。
但是,其中一些文字在访问时会出现。如果我将所有文字声明为常量(static final),那么所有这些都将一起加载。在这种情况下,将所有这些文字声明为常量是个好主意吗?在这种情况下,您能否提供一些关于垃圾收集、内存 space 预防措施的指示?这种情况下使用的最佳做法是什么?
一些注意事项:我知道字符串文字是驻留的。所以我不认为在最坏的情况下我会保存任何内存。此外,jdk 7 似乎会将这些字符串放在堆中而不是 permgen 中。我看到一个像我的couple of questions,但感觉不一样。所以发在这里。
谢谢
所有字符串文字都会自动 interned。从 JDK7+ 开始,当 class(实际上是 classloader 加载了定义字符串文字的 class 时,它们将被 GC得到 GCed(前提是没有其他 class 引用它(尽管这种情况很少发生......)。将它们设为 static
和 final
并将它们放入公共 class 确实没用从内存节省的角度来看,但从设计的角度来看很有用,因为它将提供单点访问。
相同 字符串文字在 JVM 中的所有 classes 之间共享。所以,不会有新的字符串。实际上,将它们放在一个 class 中并从那个地方访问它们会使您的代码更加结构化/更具可读性。
我的建议是,除非它能产生很大的不同,否则不要修改遗留代码。权衡是你的选择。 :P
在我处理的遗留代码库中,有大量的字符串文字。其中很大一部分是重复的。例如,字符串 "userID" 在 500 个地方使用 say。可能有一千个这样的文字被重复使用。 IntelliJ Idea 静态代码分析表明我将它们提取为常量。如果 IDE 自动为我进行此重构,而无需我输入一行代码,我应该这样做吗?
一般来说,提取许多这样的重复字符串文字作为常量是个好主意吗?这显然会避免重复,将提供单点访问、声明等。
但是,其中一些文字在访问时会出现。如果我将所有文字声明为常量(static final),那么所有这些都将一起加载。在这种情况下,将所有这些文字声明为常量是个好主意吗?在这种情况下,您能否提供一些关于垃圾收集、内存 space 预防措施的指示?这种情况下使用的最佳做法是什么?
一些注意事项:我知道字符串文字是驻留的。所以我不认为在最坏的情况下我会保存任何内存。此外,jdk 7 似乎会将这些字符串放在堆中而不是 permgen 中。我看到一个像我的couple of questions,但感觉不一样。所以发在这里。
谢谢
所有字符串文字都会自动 interned。从 JDK7+ 开始,当 class(实际上是 classloader 加载了定义字符串文字的 class 时,它们将被 GC得到 GCed(前提是没有其他 class 引用它(尽管这种情况很少发生......)。将它们设为
static
和final
并将它们放入公共 class 确实没用从内存节省的角度来看,但从设计的角度来看很有用,因为它将提供单点访问。相同 字符串文字在 JVM 中的所有 classes 之间共享。所以,不会有新的字符串。实际上,将它们放在一个 class 中并从那个地方访问它们会使您的代码更加结构化/更具可读性。
我的建议是,除非它能产生很大的不同,否则不要修改遗留代码。权衡是你的选择。 :P