[英]java: initialization of static fields of the same class during class initialization
[英]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();
}
或者,也许我在启动之后手动初始化资源,然后运行它。 逻辑上正确的方法是什么?
如果可能,请避免使Application
与enum
成为单例。 如果是普通类,则可以在构造函数中执行初始化。
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.