web-dev-qa-db-ja.com

シングルトンパターン:列挙型の使用

EnumバージョンのSingletonパターンを実装する方法がわかりません。以下は、シングルトンパターンを使用した「従来の」アプローチの実装例です。 Enumバージョンを使用するように変更したいのですが、方法がわかりません。

public class WirelessSensorFactory implements ISensorFactory{

    private static WirelessSensorFactory wirelessSensorFactory;

    //Private Const
    private WirelessSensorFactory(){
        System.out.println("WIRELESS SENSOR FACTORY");
    }

    public static WirelessSensorFactory getWirelessFactory(){

        if(wirelessSensorFactory==null){
            wirelessSensorFactory= new WirelessSensorFactory();
        }

        return wirelessSensorFactory;
    }

}
22
user3287264
public enum WirelessSensorFactory {
    INSTANCE;

    // all the methods you want
}

インスタンスは1つだけの列挙型です。

このシングルトンはスレッドセーフですが、あなたのものはそうではないことに注意してください:2つのスレッドは両方とも競合状態または可視性の問題に陥り、どちらもシングルトンの独自のインスタンスを作成します。

31
JB Nizet

標準パターンは、enumにインターフェースを実装させることです-この方法では、必要以上に機能をバックグラウンドで公開する必要はありません。

// Define what the singleton must do.
public interface MySingleton {

    public void doSomething();
}

private enum Singleton implements MySingleton {

    /**
     * The one and only instance of the singleton.
     *
     * By definition as an enum there MUST be only one of these and it is inherently thread-safe.
     */
    INSTANCE {

                @Override
                public void doSomething() {
                    // What it does.
                }

            };
}

public static MySingleton getInstance() {
    return Singleton.INSTANCE;
}
15
OldCurmudgeon

Effective Java章 here のオンラインリファレンス。

public enum WirelessSensorFactory implements ISensorFactory { // change CLASS to ENUM here

        INSTANCE; //declare INSTANCE of the Enum

        //private static WirelessSensorFactory wirelessSensorFactory;

        // Remove the private construct - it's Enum, 
        // so you don't need to protect instantiations of the class
          //private WirelessSensorFactory(){
          //   System.out.println("WIRELESS SENSOR FACTORY");
          //}

        // You don't need to check if instance is already created, 
        // because it's Enum, hence you don't need the static var
          //public WirelessSensorFactory getWirelessFactory(){
          //    if(wirelessSensorFactory==null){
          //        wirelessSensorFactory= new WirelessSensorFactory();
          //    }
          //    return wirelessSensorFactory;
          //}

        /*
         * All other methods you need and 
         * implementation of all the Factory methods from your interface
         */

}

使用法:

WirelessSensorFactory.INSTANCE.<any public method>
4
hovanessyan

ここで説明されています: http://javarevisited.blogspot.sk/2012/07/why-enum-singleton-are-better-in-Java.html それで、次のように簡単にできます:

public enum EasySingleton{
    INSTANCE;
}

また、抽象的なファクトリーデザインパターンを使用すると:

public class Singleton{
    //initailzed during class loading
    private static final Singleton INSTANCE = new Singleton();

    //to prevent creating another instance of Singleton
    private Singleton(){}

    public static Singleton getSingleton(){
        return INSTANCE;
    }
}
1
kennySystemExit

他のすべてのシングルトン作成バージョンよりもはるかに簡単です:-

public enum WirelessSensorFactory {

        INSTANCE;

        //private static WirelessSensorFactory wirelessSensorFactory;

        //Private Const
        //private WirelessSensorFactory(){

            //System.out.println("WIRELESS SENSOR FACTORY");

       // }


      //  public static WirelessSensorFactory getWirelessFactory(){

            //if(wirelessSensorFactory==null){

               // wirelessSensorFactory= new WirelessSensorFactory();
           // }

           // return wirelessSensorFactory;
       // }

}
0
Mukesh