gpt4 book ai didi

相互依赖的Java静态变量

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:23:29 27 4
gpt4 key购买 nike

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

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 将始终初始化为用作参数?

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

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 会尝试初始化它计划在从其他类初始化变量时使用的静态字段。这个对吗?它是有记录的、可预测的行为吗?

最佳答案

只要类具有树状依赖关系,就可以依赖类 X 在类 Y 需要时已初始化。一旦引入循环(类 X 需要 Y,Y 需要 X,甚至 A 需要 B,B 需要 C,C 需要 D,而 D 需要 A),行为是不确定的,并且当您更改 Java 版本、JVM 供应商、硬件时可能会发生变化平台什么的。不要那样做 - 循环依赖几乎总是糟糕计划的结果。

关于相互依赖的Java静态变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20451226/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com