Я использую перечисление, чтобы сделать несколько констант:
enum ids {OPEN, CLOSE};
значение ОТКРЫТО равно нулю, но я хочу, чтобы оно равнялось 100. Возможно ли это?
Я использую перечисление, чтобы сделать несколько констант:
enum ids {OPEN, CLOSE};
значение ОТКРЫТО равно нулю, но я хочу, чтобы оно равнялось 100. Возможно ли это?
Переменные 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.
Да. Вы можете передать числовые значения конструктору для перечисления, например:
enum Ids {
OPEN(100),
CLOSE(200);
private int value;
private Ids(int value) {
this.value = value;
}
public int getValue() {
return value;
}
}
Подробнее см. Руководство по языку Java Java.
Что можно сказать об этом:
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;
}
}
Обратите внимание, что эти два способа используют меньше памяти и больше блоков процесса. Я не говорю, что это лучший способ, но его просто другой подход.
Если вы используете очень большие типы перечислений, тогда может быть полезно следующее:
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;
}
}
Если вы хотите эмулировать перечисление 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
Функция 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.