簡體   English   中英

如何初始化靜態塊?

[英]How to initialize static blocks?

我必須使用一堆包含static塊的靜態舊式類。 這些類本身只是具有靜態方法的幫助程序類。

例:

public abstract class Legacy {
    protected static final String[] ARRAY;

    static {
        //init that ARRAY
    }

    public static String convert(String value) {
        //makes use of the ARRAY variable
    }
}

重要說明:我無法控制源,因此無法修改代碼。 我知道這是在構建類時的嚴重設計缺陷。

問題:當並發訪問該類時,如果該類尚未初始化,我會從舊類中獲取異常。 因此,我必須確保在應用程序啟動時確保每個靜態類都已正確初始化。

但是我該怎么辦呢?

我嘗試如下:

Legacy.class.newInstance();

但這導致以下錯誤:

java.lang.InstantiationException
    at sun.reflect.InstantiationExceptionConstructorAccessorImpl.newInstance(InstantiationExceptionConstructorAccessorImpl.java:48)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
    at java.lang.Class.newInstance(Class.java:374)

所以可能我做錯了嗎?

靜態初始化器是線程安全的,因為它們只能由單個線程運行。

如果一個類由多個類加載器加載,它們可能會運行多次,但是在那種情況下,它們實際上是在初始化另一個類。

因此,您看到的問題不太可能是由於初始化不完整引起的。

您的convert方法似乎更可能執行某些線程不安全的操作,例如修改數組。

如果僅調用舊類的靜態方法,則無需創建實例。 靜態塊將僅執行一次(JVM會處理)。

看到這個小例子。

class Legacy {
    static {
        System.out.println("static initializer of Legacy");
    }

    public static void doSomething() {
        System.out.println("Legacy.doSomething()");
    }
}

class LegacyDemo {
    public static void main(String[] args) {
        Legacy.doSomething();
    }
}

如果您運行LegacyDemo,它將打印

static initializer of Legacy
Legacy.doSomething()

暫無
暫無

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

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