提取大量的String文字是个好主意吗?

Atu*_*tul 3 java string static-analysis memory-management constants

在我正在处理的遗留代码库中,有大量的String文字.其中很多都是重复的.例如,字符串"userID"用于500个地方.可能有一千种这样的文字以重复的方式使用.IntelliJ Idea静态代码分析表明我将它们提取为常量.如果IDE为我自动重构,没有我键入一行代码,我应该去吗?

通常,将许多这样的重复字符串文字提取为常量是一个好主意吗?这显然可以避免重复,提供单点访问,声明等.

但是,这些文字中的一些在访问时会出现.如果我将所有文字声明为常量(静态最终),那么所有这些文字将被加载在一起.在这种情况下,将所有这些文字声明为常量是一个好主意吗?你能提供一些指向垃圾收集的指针,在这种情况下的内存空间预防措施吗?在这种情况下使用的最佳做法是什么?

一些注意事项:我知道字符串文字被实习.所以我不会在最坏的情况下保存任何内存.此外,似乎jdk 7将这些字符串放在堆而不是permgen.我看到了夫妻 问题,像我,但觉得这是不同的.所以在这里发布.

谢谢

The*_*ind 6

  1. 所有字符串文字实习自动.从JDK7 +,他们将GCed上课的时候(实际上是其加载的类加载器定义他们得到GCed定义字符串常量)(没有提供其他类是指它(虽然这种情况很少见.).让它们staticfinal和从内存保存的角度来看,将它们放入一个公共类确实是无用的,但从设计的角度看它是有用的,因为它将提供单点访问.

  2. 相同的字符串字面量在JVM在所有课程中共享.所以,没有新的字符串.实际上,将它们放在一个类中并从该位置访问它们会使您的代码更具结构性/可读性.

我的建议是,不要修改遗留代码,除非它有很大的不同.您可以选择权衡取舍.:P

  • @Atul最有可能.现在做出改变,并且正确地做*,可能比简单的查找+替换更加繁琐和复杂.例如,您需要验证每次出现的"userId"实际上是否意味着相同的事情.如果一个是例如数据库列名称而另一个是配置文件中不相关但巧合相同的密钥,那么当它们在语义上不同时,你可能会因为意外地将它们组合成相同的常量而使事情变得更糟.你必须分析所有这些. (4认同)
  • 究竟; @Atul将字符串声明为常量的真正原因是为了减少由于拼写错误而导致编码错误的可能性 - 这样做基本上可以让编译器强制执行您在任何地方使用相同的字符串; 还允许您在一次位置轻松更改字符串,并提供具有更多语义含义的字符串名称(还允许您为具有相同值但不同目的的字符串提供上下文).就内存使用而言,没有(或极小的)差异,但这是由于实习.如果遗留代码有效,则没有理由进行此类更改. (3认同)