我正在研究我的第一个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();
}
或者我可能在它启动后手动初始化资源然后再运行它。什么是逻辑上正确的方式?
答案 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();
}