Java単一の例のモード実装の静的な内部クラスの方法例


Singletonは多くの設計モードの中で最も理解しやすいものであり、多くの設計モードの中で最も重要な設計モードでもある。これから具体的に紹介します。
Singletonモードの実現の重点は、構造関数を私有化し、静的公有関数を提供することによって、クラス内で定義されている静的プライベートメンバ(prvate static xxx instance)を取得し、簡単な静的インスタンスが空であるかどうかを判断することによって、このクラスはnew一回だけ可能である。すなわち、1つのクラスを制御したのは単一のインスタンスだけであり、一般的な実装は以下のコードによって示される。

package com.study.dp.singleton; 
/** 
 *            
 * @author CrazyPig 
 * 
 */ 
public class TraditionalSingletion { 
  //     
  private static TraditionalSingletion instance; 
   
  //   new 
  private TraditionalSingletion() { 
    System.out.println("private TraditionalSingletion()"); 
  }    
  public synchronized static TraditionalSingletion getInstance() { 
    System.out.println("TraditionalSingletion getInstance()"); 
    if(instance == null) { 
      System.out.println("instance = new TraditionalSingletion()"); 
      instance = new TraditionalSingletion(); 
    } 
    return instance; 
  }    
  public static void main(String[] args) { 
    TraditionalSingletion instance = TraditionalSingletion.getInstance(); 
    System.out.println("========================================"); 
    TraditionalSingletion instance01 = TraditionalSingletion.getInstance(); 
    System.out.println("========================================"); 
    TraditionalSingletion instance02 = TraditionalSingletion.getInstance(); 
  } 
}
今日はたまたまある文章で他の巧妙なやり方を見ました。この一例の引用変数を静的な内部クラスに定義することによって、単例を実現します。これはif条件を使わずに判断することができ、マルチスレッドの安全(jvmによって保証されます)。この特殊なやり方は以下の通りです。

package com.study.dp.singleton;  
/** 
 *             
 * @author CrazyPig 
 * 
 */ 
public class SpecialSingleton {    
  //       
  private static class NestClass { 
    private static SpecialSingleton instance; 
    static { 
      System.out.println("instance = new SingletonTest()"); 
      instance = new SpecialSingleton(); 
    } 
  }    
  //     new 
  private SpecialSingleton() { 
    System.out.println("private SingletonTest()"); 
  } 
  public static SpecialSingleton getInstance() { 
    System.out.println("SingletonTest getInstance()"); 
    return NestClass.instance; 
  } 
  public static void main(String[] args) { 
    SpecialSingleton instance = SpecialSingleton.getInstance(); 
    System.out.println("========================================"); 
    SpecialSingleton instance01 = SpecialSingleton.getInstance(); 
    System.out.println("========================================"); 
    SpecialSingleton instance02 = SpecialSingleton.getInstance(); 
  } 
} 
最初にgetInstance()メソッドを参照すると、静的な内部クラスにおける静的なメンバ変数にアクセスし、この内部クラスはstaticコードブロックを呼び出す必要がある(クラスに初めてアクセスするので)。その後、再びget Instanceにアクセスすると、メソッドは直接instace参照に戻ります。このやり方は伝統的なやり方に比べてもっと巧妙である。
締め括りをつける
以上はJavaの単一の例のモードが静的な内部の種類の方法の例のすべての内容を実現することに関してで、みんなに助けがあることを望んで、興味がある友達は当駅のその他のテーマを参照することができます。