2012-07-24 35 views
15

私はアプリケーション全体(数多くのクラス)で使用されているenum型(引数はyoe CarModel)を持っています。Java enum型のget()メソッド

public enum CarModel { 
    DIABLO, 
    P911, 
    DB7; 
} 

私はさまざまな方法でこのCarModel列挙型を使用するさまざまな方法があり、それぞれが他のものを行うに進む前に、列挙型に応じて、いくつかのString変数を設定するには、switch文を持っています。 (例えば、いくつかのモデルの製造元を設定するか、原産国を設定するなど)これらの結果は実行時には静的です。

問題は、新しいモデルを列挙型に追加する場合は、各メソッドに渡し、switch文を拡張/変更してその存在を処理します。これは、人間のエラーやコードの重複(さまざまな方法が同じswitch文を使用している場合)に簡単につながる可能性があります。

は はむしろswitch文のすべてオーバーを使用するよりも、私は単一の場所に編集することができ、静的メソッドを持っていると思いますし、次のような動作を可能にする

String country = CarModel.DIABLO.getCountry() // returns Italy 
String manufacturer = CarModel.P911.getManufacturer() // returns Porsche 

このことが可能です列挙型で、(そしてこれを行うにしても「正しい」やり方列挙です?

答えて

26

を参照してください。

public enum CarModel { 
    DIABLO("Lamborghini", "Italy"), 
    P911("Porsche", "Germany"); 

    private String manufacturer; 
    private String country; 

    private CarModel(String manufacturer, String country) { 
     this.manufacturer = manufacturer; 
     this.country = country; 
    } 

    public String getManufacturer() { 
     return manufacturer; 
    } 

    public String getCountry() { 
     return country; 
    } 
} 
+0

私はこれを常に行い、絶対にenumのこれらの機能を愛しています。 – Malcolm

+0

+1すごくクール!!!古いスタイルの列挙型。 – BlaShadow

1

また列挙型は、インターフェイスを実装することができます。あなたはgetMaxSpeed()またはgetWeight()のようないくつかのget()メソッドを追加することができます。 インタフェースは

のように見えることができます10
interface car{ 
public int getMaxSpeed(); 
public int getWeight(); 
} 
3

enumを使用する場合は、enumで宣言された抽象メソッドを提案し、各enumインスタンスに対して提供された実装を提案します。あなたはどこにでもswitch文を持っていない(あなたが簡単に例を省略することができ、そこから)、あなたは、より信頼性の高いOOスタイルpolymorphicアプローチを持っている方法

abstract public int getEngineSize(); 

DIABLO { 
    public int getEngineSize() { 
     return 6.3; // whatever it really is... 
    } 
} 

あなたはこのような何かを行うことができますより多くの例/議論のためのhereなど

+0

私は – NimChimpsky

+0

@NimChimpsky前にこれを見たことがなかったです。 –

+0

@ A.H。私はそう思う、彼らは同じことを達成するが、これはむしろ奇妙で、読みにくい - 私は行方不明の彼らの実際の利点は何ですか? – NimChimpsky

7

はい、絶対に。列挙型は独自のメソッドを持つことができ、それらのメソッドは値に固有のものにすることができます。これは次のようになります。

enum CarModel { 
    P911 { 
     public String getManufacturer() { return "Porsche"; } 
    }, 
    DB7 { 
     public String getManufacturer() { return "Aston Martin"; } 
    }, 
    ... 
    public abstract String getManufacturer(); 
} 

さらに多くのメソッドを追加できます。

+0

申し訳ありません。 DB7メーカー:-)を追加しなければならなかった –

+0

ありがとう、車の男:) –

1

はい、これは行うことは非常に簡単です:

public enum CarModel { 
    DIABLO("rod"), 
    P911("jane"), 
    DB7("freddy"); 

    private String name; 
    CarModel(String name){ 
     this.name = name; 
    } 

    public String getName() { 
     return name; 
    } 
} 
2

私はあなたの列挙に直接この情報を追加することを示唆しています。このよう

public enum CarModel { 

    DIABLO("Lambo"), 
    P911 ("Porsche"); 

    private String manufacturer; 


    private CarModel(String manufacturer) { 
     this.manufacturer = manufacturer; 
    } 

    public String getManufacturer() { 
     return manufacturer; 
    }  
} 

とクラスであなただけの母getManufacturer方法

1

を使用する必要があると思いますが、私はあなたが「ファクトリー」デザインパターンを使用することをお勧めします。

CarFactory()を作成して新しいモデルカーを作成することができます。 1 korgenショーのような他の方法は非常に簡単であり、以下のコードを使用しているため、ノーサプライズ:

http://en.wikipedia.org/wiki/Factory_method_pattern

関連する問題