2016-09-14 12 views
1

私はこのチュートリアルを以下だし、あなたのシングルトンクラスは、多くのリソースを使用していない場合http://www.journaldev.com/1377/java-singleton-design-pattern-best-practices-examplesgetInstance()またはgetInstance()の前にインスタンス化が行われましたか?シングルトンを作成するため

public class EagerInitializedSingleton { 

    private static final EagerInitializedSingleton instance = new EagerInitializedSingleton(); 

    //private constructor to avoid client applications to use constructor 
    private EagerInitializedSingleton(){} 

    public static EagerInitializedSingleton getInstance(){ 
     return instance; 
    } 
} 

以下の方法が、これは使用する アプローチがあるときに所有者がコメントを持っています。しかし、ほとんどのシナリオでは、ファイルシステム、データベース接続などのために、シングルトンクラスは です。 およびクライアントが getInstanceメソッドを呼び出さない限り、インスタンス化は避けてください。

問題である:

彼らは、我々はクライアントがgetInstanceメソッド を呼び出しますが、私はこのコードで知っているように(オブジェクトインスタンスの)インスタンス化が常にときの状況がない限りまでインスタンス化を避ける必要がありを言いますクラスEagerInitializedSingleton負荷、およびEagerInitializedSingletonただ唯一、我々はEagerInitializedSingleton.getInstance()
は=>のインスタンスがgetInstance()

0123前getInstance()、決してとの時間に起きただろう呼び出すときにロード

参考:(クラスローダが最初にクラスをロードするとき)

静的変数は、実行の開始時に、一度だけ初期化されます。 (https://stackoverflow.com/a/8704607/5381331

クラスはいつロードされますか? - ;
- 及びバイトコードは、例えば、クラス(、システムへの静的参照を行うときに、新しいバイトコードが実行される(例えば、FooClass F =新しいFooClass())

はちょうど二つの場合があります。アウト) (http://www.javaworld.com/article/2077260/learn-java/learn-java-the-basics-of-java-class-loaders.html

私は間違っているか正しくありません。私にいくつかの甘さを与えてください。

答えて

2

この特定のコードの場合は、(おそらく)です。

あなたが前getInstanceの呼び出しにEagerInitializedSingletonstatic方法、あるいはどこかのコードベースで参照さEagerInitializedSingletonstaticfinalメンバーを持っていた場合は、EagerInitializedSingletoninstance変数を初期化します。

EagerInitializedSingletonクラスの反射呼び出しがClass.forNameと同じです。

遅延初期化や列挙型を含むシングルトンを宣言する別の方法があることに注意してください。

+0

ご説明いただきありがとうございます。それは私がJava alotを理解するのに役立ちます –

+0

@PhanVanLinhようこそ! – Mena

1

私は問題は、クラスがインスタンスを取得する必要なくロードされるときだと思うが、何か他の理由がある。ユーザーがそのシングルトンのインスタンスを取得したいときにクラスが初めて使用されると仮定しますが、他の理由でクラスローダーを呼び出したり、サードパーティのソフトウェアを使用してクラスには、クラスのロードが含まれますが、シングルトンのインスタンスを取得することはありません。

+0

クラスのロードとクラスの初期化を完全に混在させました。 –

1

彼らは、クライアントが getInstanceメソッド

を呼び出さない限り解決は遅延ロードされるまで、我々はインスタンス化を避けるべきであると言います。 クラス何かがJVMによってロードされると

wikipedia, Initialization-on-demand holder idiomから、クラスが 初期化を通過します。クラスには への静的変数がないため、初期化はほとんど完了しません。静的クラス の定義LazyHolderは、JVM がLazyHolderを実行する必要があると判断するまで初期化されません。静的クラス LazyHolderは、静的メソッドgetInstanceがSomethingクラスで が呼び出されたときにのみ実行され、これが初めて発生すると、 JVMがLazyHolderクラスをロードして初期化します。

public class Something { 
    private Something() {} 

    private static class LazyHolder { 
    private static final Something INSTANCE = new Something(); 
    } 

    public static Something getInstance() { 
    return LazyHolder.INSTANCE; 
    } 
} 
関連する問題