我必须使用一堆包含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方法似乎更可能执行某些线程不安全的操作,例如修改数组。

关于java - 如何初始化静态块?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28301952/

10-17 01:23