在我正在处理的遗留代码库中,有大量的String文字。其中很多都是重复的。例如,字符串" userID"用在500个地方说。可能有一千种这样的文字以重复的方式使用。 IntelliJ Idea静态代码分析表明我将它们提取为常量。如果IDE为我自动重构,没有我输入一行代码,我应该去吗?
一般来说,将许多这样的重复字符串文字提取为常量是一个好主意吗?这显然可以避免重复,提供单点访问,声明等。
然而,这些文字中的一些在访问时会出现。如果我将所有文字声明为常量(静态最终),那么所有这些文字将被加载在一起。在这种情况下,将所有这些文字声明为常量是一个好主意吗?你能提供一些指向垃圾收集的指针,在这种情况下的内存空间预防措施吗?在这种情况下使用的最佳做法是什么?
一些注意事项:我知道字符串文字是实习的。所以,在最坏的情况下,我不会挽救任何记忆。此外,似乎jdk 7将这些字符串放在堆而不是permgen。我看到了couple of questions就像我的一样,但觉得它与众不同。所以在这里张贴。
由于
答案 0 :(得分:6)
所有字符串文字自动实习。从JDK7 +开始,当类(实际上是加载定义字符串文字的类的类加载器)定义它们时,它们将被GCed(只要没有其他类引用它(尽管这种情况很少发生)。 。)。使它们static
和final
并将它们放入一个公共类中从内存保存的角度来看确实是无用的,但从设计的角度看是有用的,因为它将提供单点访问。
相同的字符串文字在JVM中的所有类之间共享。所以,没有新的字符串。实际上,将它们放在一个类中并从那个位置访问它们会使您的代码更有条理/更易读。
我的建议是,不要修改遗留代码,除非它有很大的不同。权衡取舍是你的'选择。 :P