簡體   English   中英

相互依賴的Java靜態變量

[英]Java static variables that depend upon each other

有兩個類,每個類都有自己的靜態字段。 當一個領域依賴另一個領域時會發生什么? 例如:

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

public class B {
    public final static Needed needed = new Needed();
}

我做的測試表明,在這種情況下, neededsomething之前進行初始化。 在測試中,我向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,則值為:

A.test = 1
B.test = 2

然后,如果您首先使用B加載運行測試,則值將為:

A.test = 3
B.test = -1

看起來Java只使用默認的int0 我很驚訝這段代碼編譯。

第二次測試的結果還表明Java嘗試初始化它計划在從其他類初始化變量時使用的靜態字段。 它是否正確? 它是否有記錄,可預測的行為?

只要您具有類的樹狀依賴關系,就可以依賴於類Y在需要它時初始化的類X. 一旦引入循環(類X需要Y和Y需要X,或者甚至A需要B需要需要A的C需要A),行為是未定義的,並且每當您更改Java版本,JVM供應商,硬件時可能會更改平台或其他什么。 不要這樣做 - 循環依賴幾乎總是不良規划的結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM