Могу ли я установить начальное значение enum в Java?

Я использую перечисление, чтобы сделать несколько констант:

enum ids {OPEN, CLOSE};

значение ОТКРЫТО равно нулю, но я хочу, чтобы оно равнялось 100. Возможно ли это?

Ответ 1

Переменные Java не похожи на перечисления C или С++, которые на самом деле являются просто метками для целых чисел.

Java перечисления реализованы больше как классы - и они могут даже иметь несколько атрибутов.

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

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

Большая разница заключается в том, что они являются безопасными по типу, что означает, что вам не нужно беспокоиться о назначении перечисления COLOR переменной SIZE.

Подробнее см. http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html.

Ответ 2

Да. Вы можете передать числовые значения конструктору для перечисления, например:

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

  private int value;    

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

  public int getValue() {
    return value;
  }
}

Подробнее см. Руководство по языку Java Java.

Ответ 3

Что можно сказать об этом:

public enum HL_COLORS{
          YELLOW,
          ORANGE;

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

существует только один метод.

вы можете использовать статический метод и передать параметр Enum as как:

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

Обратите внимание, что эти два способа используют меньше памяти и больше блоков процесса. Я не говорю, что это лучший способ, но его просто другой подход.

Ответ 4

Если вы используете очень большие типы перечислений, тогда может быть полезно следующее:

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

Ответ 5

Если вы хотите эмулировать перечисление C/С++ (базовые 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

Ответ 6

Функция 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

Редактировать: только что понял, что это очень похоже на ответ ggrandes, но я оставлю его здесь, потому что он очень чистый и как можно ближе к перечислению в стиле C.