有两个类,每个类都有自己的静态字段。当一个领域依赖另一个领域时会发生什么?例如:
public class A {
public final static Something something = new Something(B.needed);
}
public class B {
public final static Needed needed = new Needed();
}
测试我建议在这种情况下needed
将在something
之前初始化。在测试中,我向Java询问了类A
的变量,并且之前未加载B
。然而,结果可能只是巧合。 Java中是否有任何机制可以保证needed
始终初始化以用作参数?
我做了另一个测试。结果还表明,在极端情况下,最终基元类型具有默认值(因此它们实际上在不同的代码位置具有不同的值,尽管是最终的):
public class A {
public final static int test = 3 - B.test;
}
public class B {
public final static int test = 2 - A.test;
}
如果您以首先加载类A
的方式运行测试,则值为:
A.test = 1
B.test = 2
然后,如果您先运行B
加载测试,则值为:
A.test = 3
B.test = -1
Java似乎只使用默认的int
值0
。我对此代码编译感到惊讶。
第二次测试的结果还表明Java尝试初始化它计划在从其他类初始化变量时使用的静态字段。它是否正确?它是否有记录,可预测的行为?
答案 0 :(得分:4)
只要您的类具有树状依赖关系,就可以依赖于类Y在需要它时初始化的类X.一旦引入循环(类X需要Y和Y需要X,或者甚至A需要B需要需要A的C需要A),行为是未定义的,并且每当您更改Java版本,JVM供应商,硬件时可能会更改平台或其他什么。不要这样做 - 循环依赖几乎总是计划不良的结果。