繁体   English   中英

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

[英]Resource initialization during static initialization?

我正在开发我的第一个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();
}

或者,也许我在启动之后手动初始化资源,然后运行它。 逻辑上正确的方法是什么?

如果可能,请避免使Applicationenum成为单例。 如果是普通类,则可以在构造函数中执行初始化。

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

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

如果您需要singleton ,我个人会进行lazy initialization因为在初始化资源时可能会遇到异常,因此,如果将其实现为简单的单例,则在类的静态初始化期间可能会遇到异常,从而导致难以找到错误。

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();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM