静态初始化期间的资源初始化?

时间:2016-05-15 17:11:26

标签: java

我正在研究我的第一个Swing应用程序,现在遇到了两难:在静态初始化期间或开始实际执行后执行自举和资源初始化。我的意思是......我有Application单身人士:

public enum Appliation{
    INSTANCE;

    private static void initResources(){
        //init resources
    }

    private Application(){
         initResources();
    }

    public void run(){
        //display the gui
    }

    //remainders omitted
}

所以main方法看起来像

public static void main(String[] args){
    Application app = Application.INSTANCE;
    app.run();
}

或者我可能在它启动后手动初始化资源然后再运行它。什么是逻辑上正确的方式?

2 个答案:

答案 0 :(得分:4)

如果可能,请避免将Application设为enum的单身人士。如果它是普通类,您可以在构造函数中执行初始化。

public static void main(String[] args) {
    Application app = new Application();
    app.run();
}

这允许main()控制何时初始化类,这有很多原因。如果初始化很慢,main()控制何时以及在哪个线程上发生。如果可以例外,main()可以捕获它们。 main()还可以设置线程默认异常处理程序,配置日志记录或执行应该在Application初始化之前的其他启动任务。

答案 1 :(得分:1)

如果您需要singleton,我会亲自前进lazy initialization,因为您可以在初始化资源时获得异常,这样如果您将其实现为一个简单的单例,您可以在静态初始化期间获得异常导致很难找到bug的类。

public class Application {

    private Application() {
        initResources();
    }

    private void initResources(){
        //init resources
    }

    public static Application getInstance() {
        return ApplicationHolder.INSTANCE;
    }

    public void run(){
       //display the gui
    }

    //remainders omitted

    /**
     * Static inner class used to lazy initialize the Application, it will
     * be loaded only on Application.getInstance() such that if it fails,
     * you will easily understand that is while initializing the Application
     */
    private static class ApplicationHolder {
        private static final Application INSTANCE = new Application();
    }
}

然后您的main方法看起来像这样

public static void main(String[] args){
    Application app = Application.getInstance();
    app.run();
}
相关问题