web-dev-qa-db-ja.com

Javaで列挙型の開始値を設定できますか?

列挙型を使用していくつかの定数を作成します。

enum ids {OPEN, CLOSE};

oPEN値はゼロですが、100にする必要があります。それは可能ですか?

174
qrtt1

Java列挙型はCまたはC++列挙型とは異なり、実際には整数の単なるラベルです。

Java列挙型はクラスのように実装され、複数の属性を持つことさえできます。

public enum Ids {
    OPEN(100), CLOSE(200);

    private final int id;
    Ids(int id) { this.id = id; }
    public int getValue() { return id; }
}

大きな違いは、それらがtype-safeであるということです。つまり、COLOR列挙型をSIZE変数に割り当てることを心配する必要はありません。

詳細については、 http://docs.Oracle.com/javase/tutorial/Java/javaOO/enum.html を参照してください。

291
lavinio

はい。次のように、enumのコンストラクターに数値を渡すことができます。

enum Ids {
  OPEN(100),
  CLOSE(200);

  private int value;    

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

  public int getValue() {
    return value;
  }
}

詳細については、 Sun Java Language Guide を参照してください。

87
Paul Morie

この方法の使用についてはどうですか:

public enum HL_COLORS{
          YELLOW,
          ORANGE;

          public int getColorValue() {
              switch (this) {
            case YELLOW:
                return 0xffffff00;
            case ORANGE:
                return 0xffffa500;    
            default://YELLOW
                return 0xffffff00;
            }
          }
}

メソッドは1つだけです。

静的メソッドを使用して、Enumを次のようなパラメーターとして渡すことができます。

public enum HL_COLORS{
          YELLOW,
          ORANGE;

          public static int getColorValue(HL_COLORS hl) {
              switch (hl) {
            case YELLOW:
                return 0xffffff00;
            case ORANGE:
                return 0xffffa500;    
            default://YELLOW
                return 0xffffff00;
            }
          }

これらの2つの方法は、より少ないメモリとより多くのプロセスユニットを使用することに注意してください。

12
Maher Abuthraa

非常に大きな列挙型を使用する場合、以下が役立ちます。

public enum deneme {

    UPDATE, UPDATE_FAILED;

    private static Map<Integer, deneme> ss = new TreeMap<Integer,deneme>();
    private static final int START_VALUE = 100;
    private int value;

    static {
        for(int i=0;i<values().length;i++)
        {
            values()[i].value = START_VALUE + i;
            ss.put(values()[i].value, values()[i]);
        }
    }

    public static deneme fromInt(int i) {
        return ss.get(i);
    }

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

C/C++の列挙型をエミュレートする場合(base numおよびnexts増分):

enum ids {
    OPEN, CLOSE;
    //
    private static final int BASE_ORDINAL = 100;
    public int getCode() {
        return ordinal() + BASE_ORDINAL;
    }
};

public class TestEnum {
    public static void main (String... args){
        for (ids i : new ids[] { ids.OPEN, ids.CLOSE }) {
            System.out.println(i.toString() + " " + 
                i.ordinal() + " " + 
                i.getCode());
        }
    }
}
OPEN 0 100
CLOSE 1 101
4
ggrandes

Ordinal()関数は、enum内の識別子の相対位置を返します。これを使用して、Cスタイルの列挙型と同様に、オフセット付きの自動インデックス付けを取得できます。

例:

public class TestEnum {
    enum ids {
        OPEN,
        CLOSE,
        OTHER;

        public final int value = 100 + ordinal();
    };

    public static void main(String arg[]) {
        System.out.println("OPEN:  " + ids.OPEN.value);
        System.out.println("CLOSE: " + ids.CLOSE.value);
        System.out.println("OTHER: " + ids.OTHER.value);
    }
};

出力を与えます:

OPEN:  100
CLOSE: 101
OTHER: 102

編集:これは ggrandes 'answer と非常によく似ていることに気づいたが、非常にきれいで、できるだけ近くにいるのでここに置いておきますCスタイルの列挙

1
maharvey67