2016-10-13 3 views
-7

This answerは、privateコンストラクタ経由で一度に複数のオブジェクトをインスタンス化できないと言っています。プライベートコンストラクタが必要なのはなぜですか?

class RunDatabase{ 
    public static void main(String[] args){ 
     Database db = Database.getInstance("hello");//Only one object can be instantiated at a time 
     System.out.println(db.getName()); 
     Database db1 = Database.getInstance("helloDKVBAKHVBIVHAEFIHB"); 
     System.out.println(db1.getName()); 
    } 
} 
class Database { 

    //private static Database singleObject; 
    private int record; 
    private String name; 

    private Database(String n) { 
     name = n; 
     record = 0; 
    } 

    public static synchronized Database getInstance(String n) { 
     /*if (singleObject == null) { 
      Database singleObject = new Database(n); 
     } 

     return singleObject;*/ 

     return new Database(n); 
    } 

    public void doSomething() { 
     System.out.println("Hello StackOverflow."); 
    } 

    public String getName() { 
     return name; 
    } 
} 

期待どおりに両方の文字列が印刷されています。私は何か見落としてますか?

+2

ええ、あなたはあなたなステートメント(質問)は、exlusivly 'singleton'に参照さ一部を逃しました。 – SomeJavaGuy

+0

答えはそのようなことを言っていません。プライベートコンストラクタは単なるシングルトンパターンを強制する方法です。あなたは、そのクラスの中にあなたのメインを持つことによってそれを欺くだけです。 – f1sh

+0

コンストラクタをprivateにすることは、シングルトンパターンを実装するために必要なことの1つです。しかし、それだけではなく、それだけで自動的にそれをシングルトンにするわけではありません。 – Jesper

答えて

2

プライベートコンストラクタを使用して、一度に複数のオブジェクトをインスタンス化することはできません。

いいえ、できます。 privateコンストラクタは、クラス外のインスタンスの作成を避けるだけです。したがって、新しいオブジェクトをどのような場合に作成するかを決定する責任があります。

期待どおりに両方の文字列が印刷されています。私は何か見落としてますか?

getInstanceメソッドが呼び出されるたびに新しいインスタンスが作成されます。しかし、コメント付きコードには、シングルトンパターンの標準的な遅延初期化実装が含まれています。違いを確認するには、これらの部分のコメントを外します。

他のシングルトンの実装では、hereを見ることができます。

1

プライベートコンストラクタは、他のクラスがプライベートコンストラクタを含む "Class"のオブジェクトを作成するのを止めるために使用されます。

これは、クラスのインスタンスが1つだけ使用されるシングルトンパターンを提供するために行われます。

あなたが言及したコードは、クラスのインスタンスを1つだけ作成し、そのインスタンスを使用してそのクラスのすべての操作を実行することになっています。しかし、シングルトンデザインパターンに違反するコードを修正しました。

1

なぜプライベートコンストラクタが必要なのですか?

基本的には3つの理由:

  1. お持ちの場合は、クラスのユーザが直接オブジェクトを作成したい、と代わりにビルダーやsimilarsを使用し、

  2. ていない場合JVMが実行時にクラスのインスタンスを作成しないように、クラスを封印する必要があります。

  3. シングルトン

関連する問題