現在、次の方法で整数定数を作成しています。
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が返されます。
まあ、あなたはそのようにはできません。 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を取得します。
各列挙値に関連付けられた整数定数が必要な最も一般的な有効な理由は、それらの整数をまだ期待する他のコンポーネントと相互運用することです(たとえば、変更できないシリアル化プロトコル、または列挙がテーブルの列を表すなど) 。
ほとんどすべての場合、代わりに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
を使用でこれに対処したことに気付いたところです。
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
を返します。
そのように、その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の使用内容によって異なります。
私はこれが役立つことがわかりました:
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);
}
}
選択した値で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);
}
}