2016-08-03 176 views
2

对于单例类,将字符串常量(在成员函数内部使用)保持为private static finalprivate final是一个好主意吗?private static final String or private final String

我想知道更多关于长时间运行的应用程序和其他类的内存占用差异。

注:我知道staticfinal如何影响一个变量。我的问题是针对用于private的常量。更具体地说 - 关于那里的一生。即使当班里没有任何对象存在于记忆中。

+1

在此之前,检查使用Singleton是否好?使用DI是更简洁的方式,除非它是Logger等实用程序。 – ganesshkumar

+0

该类仅用于从内存中的文件导入数据(导入只发生一次),而字符串常量是json标记。所以它不是每个单身人士,但它的对象只创建一次(在导入过程中)。因此,这些字符串常量在导入完成后不再使用。 –

+0

[可能是'static'关键字在类中做了什么?](http://stackoverflow.com/questions/413898/what-does-the-static-keyword-do-in-a-class) – Raedwald

回答

2

只要使用它的代码仍然存在,字符串常量就会存活。理论上讲,变量引用的字符串常量可以在下次使用时释放并重新创建,但这对目前的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设计为嵌套类是privateSingleton如预期。由于我们在谈论常量,它们的使用并不意味着字段访问,而是使用常数值。换句话说,因为嵌套类Constants在运行时永远不会被实际使用,所以它永远不会被加载,因此这些字段不会占用内存,无论是在堆中还是在元空间中。

所以剩下的是代码实际上指的是常量值。如上所述,如果代码长时间不运行(只要没有其他代码或变量引用相同的常量),则甚至有收集字符串实例的理论可能性,但是这种可能性不被当前使用JVM中。在代码可到达时收集String实例也意味着必须具有原始内容,例如,以档案形式,仍在手边。


应当强调的是,代码指常量将是相同的,不管常数是否final变量,如在Singletonstatic或实例字段,在另一座级static领域,甚至局部变量。这些变体仅在不同的附加变量或附加变量存在时有所不同,指的是相同的常量。

1

这些之间没有太大的区别,只有private static final String在程序初始化时被初始化,private final String在创建单例实例时被初始化。

static字符串是唯一的好处,就是可以在静态方法也使用它(如果需要的话)

还没有性能问题与他们两个,因为这两个变量将不会只要程序正在运行,就得到垃圾回收

相关问题