Java-using-singleton

提供:Dev Guides
移動先:案内検索

Java-シングルトンクラスの使用方法

シングルトンの目的は、オブジェクトの作成を制御し、オブジェクトの数を1つだけに制限することです。 シングルトンインスタンスは1つしかないため、シングルトンのインスタンスフィールドは、静的フィールドと同じように、クラスごとに1回だけ出現します。 シングルトンは、多くの場合、データベース接続やソケットなどのリソースへのアクセスを制御します。

たとえば、データベースの接続が1つだけのライセンスを持っている場合、またはJDBCドライバーがマルチスレッドで問題を抱えている場合、Singletonは、接続が1つだけ行われること、または一度に1つのスレッドだけが接続にアクセスできることを確認します。

シングルトンの実装

例1

最も簡単な実装は、プライベートコンストラクターとその結果を保持するフィールド、およびgetInstance()などの名前の静的アクセサーメソッドで構成されます。

プライベートフィールドは、静的初期化子ブロック内から、またはより簡単に初期化子を使用して割り当てることができます。 getInstance()メソッド(これはパブリックでなければなりません)は、単にこのインスタンスを返します-

//File Name: Singleton.java
public class Singleton {

   private static Singleton singleton = new Singleton( );

  /*A private Constructor prevents any other
   * class from instantiating.
    */
   private Singleton() { }

  /*Static 'instance' method*/
   public static Singleton getInstance( ) {
      return singleton;
   }

  /*Other methods protected by singleton-ness*/
   protected static void demoMethod( ) {
      System.out.println("demoMethod for singleton");
   }
}

これは、シングルトンオブジェクトを作成するメインプログラムファイルです-

//File Name: SingletonDemo.java
public class SingletonDemo {

   public static void main(String[] args) {
      Singleton tmp = Singleton.getInstance( );
      tmp.demoMethod( );
   }
}

これは、次の結果を生成します-

出力

demoMethod for singleton

例2

次の実装は、古典的なシングルトン設計パターンを示しています-

public class ClassicSingleton {

   private static ClassicSingleton instance = null;
   private ClassicSingleton() {
     //Exists only to defeat instantiation.
   }

   public static ClassicSingleton getInstance() {
      if(instance == null) {
         instance = new ClassicSingleton();
      }
      return instance;
   }
}

ClassicSingletonクラスは、孤立したシングルトンインスタンスへの静的参照を維持し、静的getInstance()メソッドからその参照を返します。

ここでは、ClassicSingletonクラスは、シングルトンを作成するために遅延インスタンス化と呼ばれる手法を採用しています。その結果、getInstance()メソッドが最初に呼び出されるまで、シングルトンインスタンスは作成されません。 この手法により、必要な場合にのみシングルトンインスタンスが作成されます。