对于单例类,将字符串常量(在成员函数内部使用)保持为private static final
或private final
是一个好主意吗?private static final String or private final String
我想知道更多关于长时间运行的应用程序和其他类的内存占用差异。
注:我知道static
和final
如何影响一个变量。我的问题是针对用于private
的常量。更具体地说 - 关于那里的一生。即使当班里没有任何对象存在于记忆中。
对于单例类,将字符串常量(在成员函数内部使用)保持为private static final
或private final
是一个好主意吗?private static final String or private final String
我想知道更多关于长时间运行的应用程序和其他类的内存占用差异。
注:我知道static
和final
如何影响一个变量。我的问题是针对用于private
的常量。更具体地说 - 关于那里的一生。即使当班里没有任何对象存在于记忆中。
只要使用它的代码仍然存在,字符串常量就会存活。理论上讲,变量引用的字符串常量可以在下次使用时释放并重新创建,但这对目前的JVM不会发生。
尽管如此,字段仍然存在一个很小的开销,它不仅包含对象引用的大小,还包含关联的元数据,您可以避免这些引用。只需将这些常量在一个专用的支架类:
public class Singleton {
private static final class Constants {
static final String CONSTANT_1 = "Foo";
static final String CONSTANT_2 = "Bar";
static final String CONSTANT_3 = "Baz";
static final String CONSTANT_4 = "etc";
private Constants() { throw new AssertionError(); }
}
// …
// Use the constants either via Constants.CONSTANT_1, etc.
// or using import static Singleton.Constants.*; and
// unqualified names ala CONSTANT_1, CONSTANT_2, etc.
// …
}
那类并不需要是一个嵌套类,但Constants
设计为嵌套类是private
到Singleton
如预期。由于我们在谈论常量,它们的使用并不意味着字段访问,而是使用常数值。换句话说,因为嵌套类Constants
在运行时永远不会被实际使用,所以它永远不会被加载,因此这些字段不会占用内存,无论是在堆中还是在元空间中。
所以剩下的是代码实际上指的是常量值。如上所述,如果代码长时间不运行(只要没有其他代码或变量引用相同的常量),则甚至有收集字符串实例的理论可能性,但是这种可能性不被当前使用JVM中。在代码可到达时收集String实例也意味着必须具有原始内容,例如,以档案形式,仍在手边。
应当强调的是,代码指常量将是相同的,不管常数是否final
变量,如在Singleton
static
或实例字段,在另一座级static
领域,甚至局部变量。这些变体仅在不同的附加变量或附加变量存在时有所不同,指的是相同的常量。
这些之间没有太大的区别,只有private static final String
在程序初始化时被初始化,private final String
在创建单例实例时被初始化。
的static
字符串是唯一的好处,就是可以在静态方法也使用它(如果需要的话)
还没有性能问题与他们两个,因为这两个变量将不会只要程序正在运行,就得到垃圾回收。
在此之前,检查使用Singleton是否好?使用DI是更简洁的方式,除非它是Logger等实用程序。 – ganesshkumar
该类仅用于从内存中的文件导入数据(导入只发生一次),而字符串常量是json标记。所以它不是每个单身人士,但它的对象只创建一次(在导入过程中)。因此,这些字符串常量在导入完成后不再使用。 –
[可能是'static'关键字在类中做了什么?](http://stackoverflow.com/questions/413898/what-does-the-static-keyword-do-in-a-class) – Raedwald