web-dev-qa-db-ja.com

javaの列挙方法で定数として整数値を保存する

現在、次の方法で整数定数を作成しています。

public class Constants {
    public static int SIGN_CREATE=0;
    public static int SIGN_CREATE=1;
    public static int HOME_SCREEN=2;
    public static int REGISTER_SCREEN=3;
}

列挙型でこれをしようとすると

public enum PAGE{SIGN_CREATE,SIGN_CREATE,HOME_SCREEN,REGISTER_SCREEN}

PAGE.SIGN_CREATEを使用すると、1が返されます。

92

まあ、あなたはそのようにはできません。 PAGE.SIGN_CREATEは1を返しません。 PAGE.SIGN_CREATEを返します。それが列挙型のポイントです。

ただし、いくつかのキーストロークを追加する場合は、次のように列挙型にフィールドを追加できます。


    public enum PAGE{
        SIGN_CREATE(0),
        SIGN_CREATE_BONUS(1),
        HOME_SCREEN(2),
        REGISTER_SCREEN(3);

        private final int value;

        PAGE(final int newValue) {
            value = newValue;
        }

        public int getValue() { return value; }
    }

そして、PAGE.SIGN_CREATE.getValue()を呼び出して0を取得します。

169
BlairHippo

各列挙値に関連付けられた整数定数が必要な最も一般的な有効な理由は、それらの整数をまだ期待する他のコンポーネントと相互運用することです(たとえば、変更できないシリアル化プロトコル、または列挙がテーブルの列を表すなど) 。

ほとんどすべての場合、代わりにEnumMapを使用することをお勧めします。それが懸念事項であった場合、または列挙が列インデックスまたは同様のものを表す場合、コンポーネントをより完全に分離します。後で(または必要に応じて実行時に)簡単に変更できます。

 private final EnumMap<Page, Integer> pageIndexes = new EnumMap<Page, Integer>(Page.class);
 pageIndexes.put(Page.SIGN_CREATE, 1);
 //etc., ...

 int createIndex = pageIndexes.get(Page.SIGN_CREATE);

通常、これも非常に効率的です。

このようなデータを列挙インスタンス自体に追加することは非常に強力ですが、頻繁に悪用されます。

編集:これは、BlochがEffective Java /第2版のItem 33:順序インデックスの代わりにEnumMapを使用でこれに対処したことに気付いたところです。

22
Mark Peters

ordinal を使用できます。したがって、PAGE.SIGN_CREATE.ordinal()1を返します。

編集:

これを行う場合の唯一の問題は、列挙値を追加、削除、または並べ替えると、システムが破損することです。多くの場合、列挙型は削除されず、最後に追加の値が追加されるだけなので、これは問題ではありません。また、整数定数の場合も、番号を付け直さないようにする必要があります。ただし、次のようなシステムを使用するのが最善です。

public enum PAGE{
  SIGN_CREATE0(0), SIGN_CREATE(1) ,HOME_SCREEN(2), REGISTER_SCREEN(3)

  private int id;

  PAGE(int id){
    this.id = id;
  }

  public int getID(){
    return id;
  }

}

その後、getIDを使用できます。したがって、PAGE.SIGN_CREATE.getID()1を返します。

14
Adam

そのように、そのconst値を列挙型に格納できます。しかし、なぜconstを使用するのでしょうか?列挙型を保持していますか?

public class SO3990319 {
   public static enum PAGE {
      SIGN_CREATE(1);
      private final int constValue;

      private PAGE(int constValue) {
         this.constValue = constValue;
      }

      public int constValue() {
         return constValue;
      }
   }

   public static void main(String[] args) {
      System.out.println("Name:    " + PAGE.SIGN_CREATE.name());
      System.out.println("Ordinal: " + PAGE.SIGN_CREATE.ordinal());
      System.out.println("Const:   " + PAGE.SIGN_CREATE.constValue());

      System.out.println("Enum: " + PAGE.valueOf("SIGN_CREATE"));
   }
}

編集:

EnumMapを使用するか、インスタンスフィールドを使用するかは、intの使用内容によって異なります。

2
TJR

私はこれが役立つことがわかりました:

http://dan.clarke.name/2011/07/enum-in-Java-with-int-conversion/

public enum Difficulty
{
    EASY(0),
    MEDIUM(1),
    HARD(2);

    /**
    * Value for this difficulty
    */
    public final int Value;

    private Difficulty(int value)
    {
        Value = value;
    }

    // Mapping difficulty to difficulty id
    private static final Map<Integer, Difficulty> _map = new HashMap<Integer, Difficulty>();
    static
    {
        for (Difficulty difficulty : Difficulty.values())
            _map.put(difficulty.Value, difficulty);
    }

    /**
    * Get difficulty from value
    * @param value Value
    * @return Difficulty
    */
    public static Difficulty from(int value)
    {
        return _map.get(value);
    }
}
1
Clayton Bell

選択した値でintegerを対応するenumに変換できるようにする場合は、以下の自動生成コードのConstants.forValue(...)を参照してください。ただし、BlairHippoの答えはそれを行う最良の方法。

public enum Constants
{
SIGN_CREATE(0),
SIGN_CREATE(1),
HOME_SCREEN(2),
REGISTER_SCREEN(3);

    public static final int SIZE = Java.lang.Integer.SIZE;

    private int intValue;
    private static Java.util.HashMap<Integer, Constants> mappings;
    private static Java.util.HashMap<Integer, Constants> getMappings()
    {
        if (mappings == null)
        {
            synchronized (Constants.class)
            {
                if (mappings == null)
                {
                    mappings = new Java.util.HashMap<Integer, Constants>();
                }
            }
        }
        return mappings;
    }

    private Constants(int value)
    {
        intValue = value;
        getMappings().put(value, this);
    }

    public int getValue()
    {
        return intValue;
    }

    public static Constants forValue(int value)
    {
        return getMappings().get(value);
    }
}
0
Top-Master