我知道有很多关于此的主题和资源,但我想知道一个非常具体的问题(可能需要很长时间才能检查所有来源以获得明确的答案)。
我知道 JVM/Dalvik 保证当您访问类的静态字段(final static
原始值除外)时,该类的静态字段已经初始化。反之亦然吗?如果我根本不访问一个类(例如,因为switch-case
另一个静态方法中的代码永远不会到达某个分支),是否可以保证 VM 不会初始化这个类的静态变量?
假设我有这样的课程:
public class Boo {
public static int[] anything = new int[] { 2,3,4 };
private static int[] something = new int[] { 5,6,7 }; // this may be much bigger as well
public static final int[] getAndClear() {
int[] st = something;
something = null;
return st;
}
}
我的应用程序是一个非常特殊的应用程序(在某些方面并不典型),它可能包含数百个类,例如Boo
(由代码生成器生成),其中something
可能是一个元素数量不同的数组(因此它可能包含很多元素,如有时好)。
根据应用程序的输入,许多这些预生成的类可能永远不会被访问。我不希望很多int[]
对象被不必要地初始化,占用大量内存。