0

これは完全に明白なはずですが、そうではありません。以下の例のように列挙型の値を取得する方法はありますか?

例:

    public enum Numbers
    {
        zero, one, two

    }

//later on
Numbers numbers = Numbers.zero;
// this is the part that I can not figure out the java equivalent of?
int number = numbers.value();

これは私がやろうとしていることを意味していますか?

4

4 に答える 4

5

定数ordinalの順序に基づいているため、一般的に依存するのは悪い習慣と見なされます。enumより良い解決策は、各インスタンスに情報を渡すことです。次のようにコンストラクタとメソッドを書くだけです。

public enum Number {
    ZERO(0), ONE(1), TWO(2);

    private int value;

    private Number(int value) {
        this.value = value;
    }

    public int value() {
        return value;
    }
};

あとは好きなように使ってください

Number numbers = Number.ZERO;
int number = numbers.value();

Number後で sを追加する場合、コードの実際の順序について心配する必要はありません。

注: Java では、enum名前を単数形にし、定数を大文字にするのが慣用的です。

于 2013-05-22T17:57:27.250 に答える
2

メソッドを使用できますordinal()。ただし、列挙型の順序または配置を変更すると失敗するため、これはお勧めできません/危険です。たとえば、2 の累乗に変更します。

public enum Numbers {
   zero, one, two, four
}

four.ordinal() は 3 になります。

列挙型に関連付けられた数値が本当に必要な場合は、独自のメソッドを定義する必要がありますorder()。最初の実装では を返すことができましたordinal()が、後で追加するときに、fourそのメソッドを更新できます。

ps 標準的なスタイルは、列挙型を大文字にすることです。たとえば、ZERO、ONE などです...

于 2013-05-22T17:52:42.683 に答える
1

必要なものによって異なります。2 つの使用例を次に示します。

1) 入ってくる "Numbers" の値をテストする必要があるでしょう。このユース ケースでは、スイッチ ケースが最適なソリューションです。

void myMethod(Numbers n){

  switch(n){
    case zero:
    //do something
    break;

    case one:
    //do something
    break;

    //etc.
  }
}

2) また、各数値に値を割り当てて、それを取得できるようにする必要がある場合もあります。このユースケースでは、列挙型のコンストラクターを定義できます

public enum Numbers
{
    zero(0), one(1), two(2);

    private int value;

    private Numbers(int value){
      this.value=value;
    }

}

次に、コードで次の値を取得できます。

void myMethod(Numbers n){
  int value = n.getValue();
  //do something with this value...
}

最後の発言: あなたの列挙名は Java 規則に従っていません。それらは大文字で名前を付け、最終的に文字「_」にする必要があります。例: ONE、TWO、THREE、ANOTHER_VALUE

于 2013-05-22T18:01:10.843 に答える