2016-11-02 7 views
2

私はoptionTypeというフィールドを持っていて、特定のオプションに対応する4つの異なる整数値を取ることができるようにしたい。たとえば、optionType = 0は、ユーザーが特定の方法で何かを処理したいことを意味します。optionType = 1は別の方法などを意味します。これはEnumを使用する正しい方法ですか?

しかし、数値自体は意味がありません。

public class MyClass { 
    public static final int OPTION_TYPE_DO_THIS = 0; 
    public static final int OPTION_TYPE_DO_THAT = 1; 
    public static final int OPTION_TYPE_DO_SOMETHING_ELSE = 2; 
    public static final int OPTION_TYPE_DO_COOL_THING = 3; 
    private int optionType; 

    .... 

は、それがそのように、すべての定数を定義することが正常と考えられるか、

public enum OPTION_TYPE {DO_THIS, DO_THAT, DO_SOMETHING_ELSE, DO_COOL_THING}; 

のような列挙型を使用するか、私が代わりに何とか列挙型を使用してすることになっています良いですか?

+2

'enum'の名前は通常他の' class'すなわち 'OptionType'と同じようにTitleCaseにあります。 –

+0

開発者は値を知る必要はないので、' Enum'を使うことをお勧めします。オプションとその意味を理解するには、必要な列挙型を使用する必要があります。 –

+0

@PeterLawreyしかし、列挙型は定数ではなく、すべて大文字のスネークケースであると思われる定数ではありませんか? – user7086932

答えて

1

キーポイントは、より「その情報は、実行時に使用される方法」です。

switch(someEnum) { 
    case DO_THIS: ... 
    case DO_THAT: 

のようなコードを書くことを考え始めたら、間違った方向に進んでいます。

重要なのは、enum(またはそれらのさらに低レベルの数値定数のいとこ)がそのようなデザインを表現する良い方法だと考えることがよくあります。

しかし、実際にはかなりの問題が発生します。多くの場合、より優れた "より多くの方法"は、抽象基本クラスを特定のサブクラスで使用することです。言い換えれば、多型!

編集:これをもっと明確にするには...列挙型の「単一の」スイッチは実際問題ではありません。しかし、あまりにも多くの場合、人々は列挙型を切り替えるコード内の多くの場所で終わります。追加の列挙定数を作成すると、それらの場所のすべてが更新を必要とする可能性があります。私の同僚は、 "enum trap"と呼んでいます。

+0

そのスイッチのステートメントは確かに私がやろうとしていたものです。なぜそれは間違った方向ですか?害は何ですか?このような小さなものをどうやって "多型"にするのですか? – user7086932

+0

グーグルで回って、あなたはこれのようなことを言っていますか? http://stackoverflow.com/a/6392518/7086932 – user7086932

+1

あなたはようこそ!と初心者は、Googleを使用して答えを洗練...それはダブルupvoteの価値がある;-) – GhostCat

0

それはC#の文脈で書かれているにもかかわらず、

this question and answerを見て、結論はと述べている:

  • 列挙型は、軽量の状態情報に最適です。
  • スタティッククラスメンバは、特別な機能を持たなくてもこの複数の状態をサポートできます。彼らは他の言語(例えば、C/C++で)にあるよう
0

は、Javaでenum Sは単に "列挙名" よりもあります。

私の好ましい使用はステートレスな動作を提供することである。

class Calculator { 
    enum Operation { 
    ADD{ 
     double calculate(double a, double b){ return a + b;} 
    } 
    SUB{ 
     double calculate(double a, double b){ return a - b;} 
    } 
    MUL{ 
     double calculate(double a, double b){ return a * b;} 
    } 
    DIV{ 
     double calculate(double a, double b){ return a/b;} 
    } 
    abstract double calculate(double a, double b); 
    } 

    Map<String,Operation> operations = new HashMap<>(); 
    Calculator(){ 
    operations.put("+",ADD); 
    operations.put("-",SUB); 
    operations.put("*",MUL); 
    operations.put("/",DIV); 
    } 

    public double calculate(double a, String operation, double b){ 
    return operations.get(operation).calculate(a,b); 
    } 
} 
+0

注:各列挙型には 'ADD(" + ")' –

+1

@PeterLawrey:確かに、しかし、私はこの例を考えるためのOP時間を与える... –