2016-05-15 12 views
0

私は最初のSwingアプリケーションに取り組んでおり、今やジレンマを思いついています。スタティック初期化中または実際の実行開始後にブートストラップとリソースの初期化を実行します。だから、main方法は静的初期化中のリソースの初期化?

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

それとも私はそれが始まっています後に手でリソースを初期化し、それを実行するようになり

public enum Appliation{ 
    INSTANCE; 

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

    private Application(){ 
     initResources(); 
    } 

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

    //remainders omitted 
} 

:私は何を意味するのですか...私はApplicationシングルトンを持っています。論理的に正しい方法は何でしょうか?

答えて

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(); 
} 
ようになります。
関連する問題