相互依赖的Java静态变量

时间:2013-12-08 08:11:22

标签: java static

有两个类,每个类都有自己的静态字段。当一个领域依赖另一个领域时会发生什么?例如:

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似乎只使用默认的int0。我对此代码编译感到惊讶。

第二次测试的结果还表明Java尝试初始化它计划在从其他类初始化变量时使用的静态字段。它是否正确?它是否有记录,可预测的行为?

1 个答案:

答案 0 :(得分:4)

只要您的类具有树状依赖关系,就可以依赖于类Y在需要它时初始化的类X.一旦引入循环(类X需要Y和Y需要X,或者甚至A需要B需要需要A的C需要A),行为是未定义的,并且每当您更改Java版本,JVM供应商,硬件时可能会更改平台或其他什么。不要这样做 - 循环依赖几乎总是计划不良的结果。