Я використовую enum, щоб зробити кілька констант:
enum ids {OPEN, CLOSE};
значення OPEN дорівнює нулю, але я хочу його як 100. Це можливо?
enum ids {OPEN = 100, CLOSE};
?
Я використовую enum, щоб зробити кілька констант:
enum ids {OPEN, CLOSE};
значення OPEN дорівнює нулю, але я хочу його як 100. Це можливо?
enum ids {OPEN = 100, CLOSE};
?
Відповіді:
Перерахунки 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 для отримання додаткової інформації.
enum class
.
Так. Ви можете передати числові значення конструктору для enum, наприклад:
enum Ids {
OPEN(100),
CLOSE(200);
private int value;
private Ids(int value) {
this.value = value;
}
public int getValue() {
return value;
}
}
Додаткову інформацію див. У посібнику з мови Sun Sun.
value
до нуля (скажімо). Потім включіть (скажіть) DANCE
у список значень.
Що використовувати цей спосіб:
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;
}
}
Зауважте, що ці два способи використовують менше пам'яті та більше процесорних одиниць. Я не кажу, що це найкращий спосіб, але це просто інший підхід.
getColorValue()
синхронізується у другому прикладі?
HL_COLORS.getColorValue(HL_COLORS.YELLOW);
не ініціалізувати перерахунок.
Якщо ви використовуєте дуже великі типи перерахунків, наступне може бути корисним;
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 / C ++ (базовий номер та додаткові додатки):
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 () повертає відносне положення ідентифікатора в enum. Ви можете використовувати це для автоматичного індексування зі зміщенням, як при перерахунку в стилі С.
Приклад:
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
Редагувати: щойно зрозумів, що це дуже схоже на відповідь грандів , але я залишу його тут, оскільки він дуже чистий і приблизно такий близький, як можна дістатися до переліку стилю C.
@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");
}
}
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
тобто такої невеликої групи заздалегідь визначених констант.
Я думаю, що ви розгублені в перегляді переліків 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);
}
};