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

194

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

enum ids {OPEN, CLOSE};

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

qrtt1
источник
@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
ggrandes
источник
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.

maharvey67
источник
В примере вы берете 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то есть такой небольшой группы предопределенных констант.

Gibbs
источник
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);
}
};
Coristat
источник