[英]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.