2016-12-24 8 views
2

オブジェクトの作成とコードへの注入にクラスの代わりにEnumを使用する人がいます。例えばPOJOによる制御と依存性注入の反転

public enum EnumSample { 
    INSTANCE; 
    private String name = "Sample Enum"; 
    private String version = "1"; 
    public String getName() { 
     return this.name; 
    } 

    public String getVersion() { 
     return this.version; 
    } 
} 

とクラスで:

public class MyClass { 
    public static void main(String[] args) { 
     new App(); 
    } 
} 

public class App { 
    private EnumSample enumSample = EnumSample.INSTANCE; 
    public App() { 
     System.out.printf("%s - %s",enumSample.getName(), enumSample.getVersion()); 
    } 
} 

だから、正しいでしょうか?ので、OracleのWebサイトでのJavaのドキュメントで、彼らは言った:Javaのdocumentsから

-

あなたが列挙型を使用すると、定数の固定セットを表現するために必要なすべての時間を使用する必要があります。これには、ソーラーシステムの惑星などの自然な列挙型や、メニューの選択やコマンドラインフラグなど、コンパイル時にすべての値を知っているデータセットが含まれます。

私はちょうどこの方法が正しいかどうかを知りたがっていますか、より良いパターンですか?いずれかでそれを共有してくださいがある場合は一例であり、ここで...

私は列挙型がSingeltonのもののためcorretであることを得たそのバージョンをご検討ください...私はちょうど列挙せずにこれらを行うために他の方法を見つけたいです私...おかげ

答えて

1

は、Javaでenumのための2つの主要なユースケースが実際にあります:Javaのドキュメントに直接言及したよう

(1)定数の固定セットを定義します。

(2)enumは、クラス(つまり、synchronizeなどを明示的に使用せずに)に対してシングルトンインスタンスを安全に(スレッド化して)作成するためにも使用できます。この件に関してhereを参照することができます。あなたのEnumSample

は、あなたが実際には1つの変数とINSTANCE(ユースケース上記2)で参照することができるEnumSampleの1つのオブジェクトのみを作成しています。

私はEnumがSingeltonのものに対して正しいと判断しました。私はちょうど Enumなしでこれを行うための他の方法を見つけたいと思います。

public class Sample { 

    //Create a static final object  
    private static final Sample INSTANCE = new Sample(); 

    //private constructor, so this class can't instantiated from outside 
    private Sample() { 
    } 

    //Use the getInstance() static method which returns same instance always 
    public static Sample getInstance() { 
     return INSTANCE; 
    } 

    private String name = "Sample Enum"; 
    private String version = "1"; 
    public String getName() { 
     return this.name; 
    } 

    public String getVersion() { 
     return this.version; 
    } 
} 

public class App { 

    public App() { 
     System.out.printf("%s - %s",Sample.getInstance().getName(), 
      Sample.getInstance().getVersion()); 
    } 
} 

次のことができます。

はJavaでは、スレッドセーフな方法でシングルトンインスタンスを作成するには、いくつかの方法があり、そのうちの一つは、privateコンストラクタでstaticfinalINSTANCEを使用してその下に示されていますシングルトンを安全に作成する他の方法についてはhereを参照してください。

+0

それは正しいです... OKそれは良いです...そして、より良い方法? –

+0

enumを使用して使用するか使用しないで良い方法がありますか? – developer

+0

Enumなしで意味します –