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


194

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

enum ids {OPEN, CLOSE};

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


@ScottF Вы хотите, как использовать перечисления?
Аниш Б.

В верхнем ответе есть определение enum. Я хотел бы пример того, как это определенное перечисление будет использоваться в коде. Например, как определенный 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; }
}

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

См. Http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html для получения дополнительной информации.


Исходя из вашего утверждения, лучше всего будет использовать java для создания перечисления последовательных целых чисел (аналогично перечислению C ++) для индекса в массиве или чего-то такого: enum Ids {NAME (0), AGE (1) ), ВЫСОТА (2), ВЕС (3); } Спасибо, -бн
бн.

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

1
Подскажите, пожалуйста, как использовать это перечисление в функции?
Ошибки происходят

2
Ленивым стандартам Java не разрешено устанавливать значение для перечисления. По крайней мере, c # позволяет это И является тип-безопасным.
Ксмит

2
FWIW, C ++ 11 теперь имеет безопасный тип enum class.
Феникс

93

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

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 для получения дополнительной информации.


Прохладно. Можно ли смешивать? Т.е. присваивать только номера выбранным значениям Enum.
Фредерик Норд

закрытый модификатор избыточен для конструкторов перечислений
Нино ван

@FrederickNord - Конечно. Просто добавьте второй приватный конструктор без аргументов, который инициализируется value(скажем) нулем. Затем включите (скажем) DANCEв список значений.
Стивен С.

15

как насчет использования этого способа:

public enum HL_COLORS{
          YELLOW,
          ORANGE;

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

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

Вы можете использовать статический метод и передать 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;
            }
          }

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


1
Почему getColorValue()синхронизируется во втором примере?
josaphatv

@josaphatv Все функции во втором примере статичны и никогда не меняются. Вы можете захотеть HL_COLORS.getColorValue(HL_COLORS.YELLOW);без инициализации enum.
мазунки

11

Если вы используете очень большие типы enum, то может быть полезно следующее;

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 ++ (базовые числа и инкременты 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

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


В примере вы берете enum и получаете int. Можете ли вы показать обратное, взять int и получить перечисление (без явного регистра переключателя для каждого значения?)
ScottF

Что касается вопроса, я считаю, что это самый подходящий ответ. Здесь мы изменили индекс enum по умолчанию, чтобы он начинался со 100, не определяя новую переменную и не назначая их через конструктор.
Рахул Джайн

@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для OPENи 200для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 week, colors 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);
}
};
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.