对于 Singleton类,最好将String常量(在成员函数内部使用)保持为private static final
或private final
?
我希望了解更长时间运行的应用程序的类内存占用差异。
注意:我知道static
和final
如何影响变量。我的问题特定于用作private
类的常量。更具体地说 - 关于那里的生命。即使没有那个阶级的对象存在于记忆中。
答案 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
被设计为嵌套类,按预期为private
到Singleton
。由于我们讨论的是常量,因此它们的使用并不意味着字段访问,而是使用常量值。换句话说,由于嵌套类Constants
在运行时从未实际使用过,因此它永远不会被加载,因此,字段不会占用内存,也不会占用内存空间中的内存。
剩下的是,代码实际上是指常量值。如上所述,如果代码不运行较长时间(只要没有其他代码或变量引用相同的常量),甚至有理论收集字符串实例的可能性,但当前没有使用这种可能性JVM中。在代码可到达时收集String实例也意味着必须具有原始内容,例如,在课堂档案中,还在手边。
应该强调的是,引用常量的代码将是相同的,无论常量是final
变量,如static
还是Singleton
中的实例字段另一个持有者类中的1}},static
个字段,甚至是局部变量。这些变体仅在是否存在或存在何种附加变量方面存在差异,指的是相同的常量。
答案 1 :(得分:1)
这些之间差别不大,只是在程序初始化时private static final String
被初始化,private final String
在创建单例实例时被初始化。
static
String的唯一优点是,你也可以在静态方法中使用它(如果你需要它们)
此外,两者都没有性能问题,因为只要程序正在运行,两个变量都不会垃圾收集。