Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
相互依赖的Java静态变量_Java_Static - Fatal编程技术网

相互依赖的Java静态变量

相互依赖的Java静态变量,java,static,Java,Static,有两个类,每个类都有自己的静态字段。当一个领域依赖于另一个领域时会发生什么?例如: public class A { public final static Something something = new Something(B.needed); } public class B { public final static Needed needed = new Needed(); } 我做的测试表明,在这种情况下,所需的将在某物之前初始化。在测试中,我要求Java提供类

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

public class A {
    public final static Something something = new Something(B.needed);
}

public class B {
    public final static Needed needed = new Needed();
}
我做的测试表明,在这种情况下,
所需的
将在
某物
之前初始化。在测试中,我要求Java提供类
A
的变量,而
B
以前没有加载。然而,结果可能只是巧合。Java中是否有任何机制可以保证
needed
总是初始化为用作参数

我做了另一个测试。结果还表明,在极端情况下,final基元类型具有默认值(因此,尽管是final,但它们在代码的不同位置实际上具有不同的值):

如果以先加载类
a
的方式运行测试,则值将为:

A.test = 1
B.test = 2
A.test = 3
B.test = -1
然后,如果您首先在加载
B
的情况下运行测试,则值将为:

A.test = 1
B.test = 2
A.test = 3
B.test = -1
Java似乎只是使用默认值
int
value
0
。我很惊讶这段代码能够编译


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

只要类具有树状依赖关系,就可以依赖于类X在类Y需要时已初始化。一旦引入循环(类X需要Y,Y需要X,甚至A需要B需要C需要D需要A),行为就没有定义,并且可能会在您更改java版本、JVM供应商、硬件平台或其他任何东西时发生变化。不要这样做-循环依赖几乎总是由于计划不当造成的。

有关详细信息,请参阅可能重复的“小心”-此类依赖有时会导致可维护性损失。