如何初始化静态块?

时间:2015-02-03 14:57:46

标签: java static

我必须处理一堆包含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)

所以我可能做错了?

2 个答案:

答案 0 :(得分:1)

静态初始化程序是线程安全的,因为它们只能由单个线程运行。

如果类由多个类加载器加载,它们可能会运行多次,但在这种情况下,它们实际上是在初始化另一个类。

因此,您所看到的问题不太可能是由于初始化不完整。

您的convert方法似乎更有可能执行非线程安全的操作,例如修改数组。

答案 1 :(得分:0)

如果只调用遗留类的静态方法,则无需创建实例。静态块只执行一次(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()