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


194

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

enum ids {OPEN, CLOSE};

OPEN値はゼロですが、100にしたいのですが可能ですか。


@ScottF列挙型の使用方法が必要ですか?
アニッシュB.

上の答えには、列挙型の定義があります。その定義された列挙型がコードでどのように使用されるかの例が欲しいのですが。たとえば、定義されたctorを使用して、特定の整数値を持つenumインスタンスを作成するにはどうすればよいでしょうか。
ScottF

@ScottF私があなたなら、この投稿に賞金を設定するのではなく、完全に新しい質問を投稿したいです.....または、列挙型に関するドキュメントを読んでください。それに関するいくつかのコア知識を把握する必要があるようです;)
lealceldeiro

enum ids {OPEN = 100, CLOSE};
オスカー氏

回答:


307

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; }
}

大きな違いは、タイプセーフであることです。つまり、SIZE変数にCOLOR列挙型を割り当てることについて心配する必要はありません。

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


ステートメントに基づいて、配列または何かへのインデックスのために、javaを使用して連続した整数の列挙(C ++ enumに類似)を作成するベストプラクティスは、次のように記述します:enum Ids {NAME(0)、AGE(1 )、HEIGHT(2)、WEIGHT(3); }ありがとう、-bn
bn。

おそらく、特に整数値をどこかにシリアル化する場合は特にそうです。
lavinio

1
この列挙型を関数で使用する方法を教えてください。
バグは

2
enumに値を設定できないようにするのは、Java標準の怠惰です。少なくともc#はこれを許可し、かつ型セーフです。
csmith 2016年

2
FWIW、C ++ 11にはタイプセーフがありenum classます。
フェニックス

92

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

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

  private int value;    

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

  public int getValue() {
    return value;
  }
}

詳細については、Sun Java言語ガイド参照してください。


涼しい。混ぜることはできますか?つまり、選択した列挙値に番号を割り当てるだけです。
Frederick Nord

enumコンストラクターのプライベート修飾子は冗長です
Nino van Hooff 2017年

@FrederickNord-はい。value(たとえば)0に初期化する引数のない2番目のプライベートコンストラクターを追加するだけです。次に、(たとえば)DANCE値のリストに含めます。
スティーブンC

15

この方法の使い方について:

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つの方法は、より少ないメモリとより多くのプロセスユニットを使用することに注意してください..これは最良の方法とは言えませんが、それは単なる別のアプローチです。


1
getColorValue()2番目の例で同期されるのはなぜですか?
josaphatv 2013年

@josaphatv 2番目の例のすべての機能は静的であり、変更されることはありません。HL_COLORS.getColorValue(HL_COLORS.YELLOW);列挙型を初期化せずにしたい場合があります。
mazunki

11

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

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;
    }
}

7

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

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

ordinal()関数は、列挙内の識別子の相対位置を返します。これを使用して、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

編集:これはグランデスの答えに非常に似ていることに気づきましたが、非常にクリーンで、Cスタイルの列挙型に近づくことができるため、ここではそのままにします。


この例では、列挙型を取得してintを取得します。逆を示し、intを取り、enumで終了することができます(各値の明示的なスイッチケースなし?)
ScottF

質問の通り、これが最も適切な答えだと思います。ここでは、列挙型のデフォルトインデックスを100から開始するように変更しました。新しい変数を定義してコンストラクターでそれらを割り当てることはありません。
Rahul Jain

@RahulJain私はむしろ受け入れられた答えを使いたいです。きれいに見えます。
lealceldeiro

1

@scottf

列挙型はシングルトンのようなものです。JVMがインスタンスを作成します。

クラスで自分で作成する場合は、次のようになります。

public static class MyEnum {

    final public static MyEnum ONE;
    final public static MyEnum TWO;

    static {
        ONE = new MyEnum("1");
        TWO = new MyEnum("2");
    }

    final String enumValue;

    private MyEnum(String value){
        enumValue = value;    
    }

    @Override
    public String toString(){
        return enumValue;
    }


}

そして、そのように使用できます:

public class HelloWorld{

   public static class MyEnum {

       final public static MyEnum ONE;
       final public static MyEnum TWO;

       static {
          ONE = new MyEnum("1");
          TWO = new MyEnum("2");
       }

       final String enumValue;

       private MyEnum(String value){
           enumValue = value;    
       }

       @Override
       public String toString(){
           return enumValue;
       }


   }

    public static void main(String []args){

       System.out.println(MyEnum.ONE);
       System.out.println(MyEnum.TWO);

       System.out.println(MyEnum.ONE == MyEnum.ONE);

       System.out.println("Hello World");
    }
}

0
 public class MyClass {
    public static void main(String args[]) {
     Ids id1 = Ids.OPEN;
     System.out.println(id1.getValue());
    }
}

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

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

@ scottf、ENUMで定義されたコンストラクタのために、おそらく混乱しました。

それについて説明させてください。

ときclass loaderの負荷のenumクラスは、その後、enumコンストラクタとも呼ばれます。何の上に!!はい、それはと呼ばれOPENていcloseます。何の値を持つ100ためOPEN200のためにclose

別の値を設定できますか?

はい、

public class MyClass {
    public static void main(String args[]) {
     Ids id1 = Ids.OPEN;
     id1.setValue(2);
     System.out.println(id1.getValue());
    }
}

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

    private int id;
    Ids(int id) { this.id = id; }
    public int getValue() { return id; }
    public void setValue(int value) { id = value; }
}

しかし、それは悪い習慣です。enum表すために使用されるconstantsようにdays of weekcolors in rainbow事前に定義された定数、すなわち、このような小さなグループ。


0

C ++列挙子を見て混乱していると思います。Java列挙子は異なります。

これは、C / 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);
}
};
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.