web-dev-qa-db-ja.com

Javaのint値を持つ列挙

Java C#と同等:

enum Foo
{
  Bar = 0,
  Baz = 1,
  Fii = 10,
}
51
ripper234

enumの属性が必要な場合は、次のように定義する必要があります。

public enum Foo {
    BAR (0),
    BAZ (1),
    FII (10);

    private final int index;   

    Foo(int index) {
        this.index = index;
    }

    public int index() { 
        return index; 
    }

}

次のように使用します。

public static void main(String[] args) {
    for (Foo f : Foo.values()) {
       System.out.printf("%s has index %d%n", f, f.index());
    }
}

理解するべきことは、enumはクラスを作成するための単なるショートカットであるため、必要な属性とメソッドをクラスに追加できるということです。

enumでメソッドを定義したくない場合は、メンバー変数のスコープを変更してpublicにすることができますが、それは 例SunのWebサイトで

81
Dave Webb

連続する値の範囲があり、必要なのが整数値だけである場合、列挙型を最小限に宣言できます。

public enum NUMBERZ {
        ZERO, ONE, TWO
}

次に、次のようにint値を取得します。

int numberOne = NUMBERZ.ONE.ordinal();

ただし、不連続な範囲が必要な場合(例のように、1から10にジャンプする場合)、独自のメンバー変数を設定する独自の列挙コンストラクターを記述し、その変数にgetメソッドを提供する必要があります。ここの他の回答で。

15
Carl

それは:

_enum Foo
{
  Bar(0),
  Baz(1),
  Fii(10);

  private int index;

  private Foo(int index) {
      this.index = index;
  }
}
_

インデックスから列挙の値を取得する場合、Foo.valueOf(1)(*)は機能しないことに注意してください。自分でコーディングする必要があります。

_public Foo getFooFromIndex(int index) {
    switch (index) {
    case 0:
        return Foo.Bar;
    case 1:
        return Foo.Baz;
    case 10:
        return Foo.Fii;

    default:
        throw new RuntimeException("Unknown index:" + index);
    }
}
_

(*):Enum.valueOf()は、Stringから列挙を返します。そのため、Foo.valueOf('Bar')で値Barを取得できます

4

次のようなものが欲しいようです。

public enum Foo {
    Bar(0),
    Baz(1),
    Fii(10);

    private int number;

    public Foo(int number) {
       this.number = number;
    }

    public int getNumber() {
        return number;
    }
}

手始めに、Sunの Java Enum Tutorial は、さらに学ぶのに最適な場所です。

2
Peter
public enum Foo {
    Bar(0),
    Baz(1),
    Fii(10);

    private final int someint;
    Foo(int someint) {
        this.someint = someint;
    }
}

In Java列挙型は他のクラスと非常に似ていますが、Javaコンパイラはさまざまな状況で少し異なる方法で処理することを知っています。データのインスタンス変数と適切なコンストラクターが必要なようです。

0
Tendayi Mawushe