web-dev-qa-db-ja.com

Javaシングルトンパターン

編集:回答済み-エラーはメソッドが静的ではなかった

私が使用している シングルトンデザインパターン

 public class Singleton {
   private static final Singleton INSTANCE = new Singleton();

   // Private constructor prevents instantiation from other classes
   private Singleton() {}

   public static Singleton getInstance() {
      return INSTANCE;
   }
 }

私の質問は、anotherクラスでクラスSingletonのオブジェクトを作成するにはどうすればよいですか?

私はもう試した:

Singleton singleton = new Singleton(); 
// error - constructor is private
Singleton singleton = Singleton.getInstance();
// error - non-static method cannot be referenced from a static context

正しいコードは何ですか?

ありがとう、スペンサー

17
Spencer
_Singleton singleton = Singleton.getInstance();
_

正しい方法です。 getInstance()メソッドが実際にstaticであることを確認してください。

Singletonの実装は安全とはほど遠いため、オブジェクトはリフレクションを介してインスタンス化できるため、 enum に基づいてシングルトンを作成することをお勧めします。

26
Bozho

Singleton singleton = Singleton.getInstance();は機能するはずです-コードを考えると、そのエラーは意味がありません。正しく報告していますか? (上記のコードで行ったgetInstanceメソッドを静的にするのを忘れていた場合は意味があります。)

あなたがクラスのために私たちに与えたコードは正しいです。

最後に、1つの概念的な注意事項:まず、「クラスシングルトンのオブジェクトを作成する」のではありません。これがシングルトンの要点です。 :)既存のオブジェクトへの参照を取得しているだけです。

3
Etaoin

これです:

_ Singleton singleton = Singleton.getInstance();
_

動作するはずです。これは、Javaで静的メソッドを呼び出す方法です。そして、getInstance()メソッドはstaticとして宣言されています。まったく同じSingletonクラスを使用していますか?または、同じというクラスを他のパッケージにインポートした可能性があります。

2

複数のコピーへのアクセスを許可したくないためです。したがって、オブジェクトを手動でインスタンス化する必要がありますが、アクセサメソッドへの後続の呼び出しが(新しいものを作成するのではなく)シングルトンを返すことができるように、シングルトンへの参照を保持する必要があります。だからです

Singleton singleton = Singleton.getInstance();

SingletonObjectにアクセスする正しい方法。

2
user1646438
  1. コンストラクターはプライベートであるため、コンストラクターを使用してオブジェクトを作成することは意味がありません。
  2. public static Singleton getInstance()を使用する必要がありますが、実装はあまり正しくありません。

    if (instance == null) {
    instance = new Singleton();
    }
    return instance;

これはあなたがそれをするべき方法です。これにより、インスタンスが存在しない場合はインスタンスが作成されるか、単に既存のインスタンスが返されます。あなたのコードも同じことをしますが、これは読みやすさを増します。

2
Vaishak Suresh

次のように、クラスの複数のインスタンスを作成することは引き続き可能です。

Singleton.getInstance().clone()
1
user

使用しても問題ありません

Singleton singleton = Singleton.getInstance();
// error - non-static method cannot be referenced from a static context

これは、クラスからシングルトンオブジェクトを取得する方法です。私に何か他のものがなければなりません。詳細を投稿してください

1
vijay.shad

getInstance()メソッドは「静的」でインスタンスフィールドでもあるため、Singleton.getInstance();を使用できます。クラスの新しいexepleを作成せずに。 Thihsはシングルトーンのポイントです

0
Patrik