@H_301_1@在定义或初始化之前,无法引用静态字段:
static Integer j = i; /* compile error */ static final Integer i = 5;
但是,当从实例初始化块(在匿名内部类中)引用它时,甚至不会生成警告.
参见示例:
class StaticInitialization { static final Object o = new Object() {{ j = i; }}; static Integer j,k; static final Integer i = 5; static final Object o2 = new Object() {{ k = i; }}; }
结果是:j == null,k == 5,所以很清楚,我们做了一个引用,命令重要,没有警告或编译错误.
这段代码是否合法?
解决方法
这段代码是否合法?大概.我不认为这是编译器的工作,以分析你的故意的副作用的对象实例化在修补静态变量.
来自同一类别中其他静态的“声明之前”的有限分析确实只是对最常见的嘘声的帮助,而不是对间接错误的烙印保证.
我真的并不惊讶,“在引用之前声明”分析在范围上有限,直接访问静态变量在其他静态声明中.这是一个简单&最小复杂度的紧凑分析非常快.
扩展它以考虑对象实例化的副作用&方法调用,OTOH,将需要20-1000倍的更大的重量&静态程序分析范围.静态分析需要访问潜在的整个编译程序代码,使用基于约束的计算来确定可能发生的情况以及可能在分钟内运行的时间.
考虑到这些选择,在Java语言设计师的鞋子中,选择简单的分析仅涵盖同一类中的字段的直接访问是相当容易的.