4

マルチスレッド環境では、どちらが実際に優れているのか疑問に思います。クラスがロードされるときに列挙型がインスタンスを作成するので、シングルトンを理解しています。それ以外に重要なことは何もありません。長所と短所はありますか?

タイプとしてのシングルトンEnum

 public enum Singleton {
      INSTANCE;
      public void doSomething(){ ... }
 }

シングルトンdouble-checked locking

 public class Singleton{
      private volatile static Singleton instance;

      private Singleton(){}
      public static Singleton getInstance(){
           if(instance == null){
                 synchronized(Singleton.class){
                       if(instance == null){
                           instance = new Singleton();
                       }
                 }
           }
           return instance;
      }

 }
4

3 に答える 3

5

多くの場合、マルチスレッド アプリケーションでは、コードが単純で理解しやすいほど、動作しやすくなります。

私の考えでは、最初の例は2 番目の例よりもはるかに単純であり、それが重要です。

を使用する主な長所enumは、はるかに単純であり、より複雑な例は正当化されないことです。二重ロックの例では、単体テスト用に興味深い方法でシングルトンを変更できますが、これにより得られるものは別の方法で解決できると思います。

于 2012-08-12T20:27:53.250 に答える
2

シングルトンには、正しい実装だけでなく、さらに多くの問題があります。

多くの場合、シングルトンを使用するため、複数のメソッド間でオブジェクトを渡す必要がある、または渡さなければならない場所で、オブジェクトを渡す必要はありません。

Singleton を使用して jdbc 接続をインスタンス化する例は多数あります。

この接続が必要なメソッドでは、シングルトンであるため、簡単にアクセスできます。

public enum DBConnection {
  INSTANCE;
  private Connection connection;
  public Connection getConnection(){
    if(connection == null){
      instantiateConnection();
    }
    return connection;
  }
}

そしてそれにアクセスする

DBConnection.INSTANCE.getConnection();

しかし、多くの場合、依存性注入と快適なフレームワークを使用して行う方が適切です。たとえばGUICE。

あなたのコードでは、DBConnection.INSTANCE で呼び出しを行わず、getConnection() で呼び出すよりも、クラスには @Inject で注釈が付けられたフィールド DBConnection があります。そして、あなたはそれを使うだけです。

@Inject
private DBConnection dBConnection;

そして、クラスは @Singleton でアノテーションを付けてシングルトンにするだけで、フレームワークはそれがシングルトンであることを保証します。

また、テストと本番などの異なる環境がある場合は、フレームワークに環境ごとに異なるオブジェクトを注入させることができます。

于 2012-08-12T21:33:53.177 に答える
1

を使用enumして作成することは、簡単で迅速な方法でsingletonあることから人気を博しています。

さらに、ここでダブルチェックロックと比較しましたが、列挙型を使用しない他の方法もあります。

例えば:

public class Test{

      private static Test uniqueInstance = new Test();

      private Test(){}

      public static Test getInstance(){


             return uniqueInstance;     
         }

 }

しかし、私enum singleton .

于 2012-08-12T20:51:10.153 に答える