2016-05-15 133 views
0

我正在處理我的第一個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(); 
} 

或者,也許我的手初始化資源它啓動後,然後運行它。什麼是合乎邏輯的正確方法?

回答

4

如果可能,請避免使Applicationenum單身。如果它是一個普通的類,你可以在構造函數中執行初始化。

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

這使得當類初始化,這是很好的原因很多main()控制。如果初始化速度很慢,main()控制何時發生線程。如果可能例外,main()可以捕獲它們。 main()也可以設置線程默認的異常處理程序,配置日誌記錄,或執行應該在Application的初始化之前的其他啓動任務。

1

如果你需要一個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(); 
}