private static final String或private final String

时间:2016-08-03 12:14:56

标签: java string singleton constants

对于 Singleton类,最好将String常量(在成员函数内部使用)保持为private static finalprivate final

我希望了解更长时间运行的应用程序的类内存占用差异。

注意:我知道staticfinal如何影响变量。我的问题特定于用作private类的常量。更具体地说 - 关于那里的生命。即使没有那个阶级的对象存在于记忆中。

2 个答案:

答案 0 :(得分: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变量,如static还是Singleton中的实例字段另一个持有者类中的1}},static个字段,甚至是局部变量。这些变体仅在是否存在或存在何种附加变量方面存在差异,指的是相同的常量。

答案 1 :(得分:1)

这些之间差别不大,只是在程序初始化时private static final String被初始化,private final String在创建单例实例时被初始化。

static String的唯一优点是,你也可以在静态方法中使用它(如果你需要它们)

此外,两者都没有性能问题,因为只要程序正在运行,两个变量都不会垃圾收集