Używam wyliczenia, aby utworzyć kilka stałych:
enum ids {OPEN, CLOSE};
wartość OTWARTA wynosi zero, ale chcę mieć wartość 100. Czy to możliwe?
enum ids {OPEN = 100, CLOSE};
?
Używam wyliczenia, aby utworzyć kilka stałych:
enum ids {OPEN, CLOSE};
wartość OTWARTA wynosi zero, ale chcę mieć wartość 100. Czy to możliwe?
enum ids {OPEN = 100, CLOSE};
?
Odpowiedzi:
Wyliczenia Java nie są podobne do wyliczeń C lub C ++, które tak naprawdę są po prostu etykietami liczb całkowitych.
Wyliczenia Java są implementowane bardziej jak klasy - i mogą nawet mieć wiele atrybutów.
public enum Ids {
OPEN(100), CLOSE(200);
private final int id;
Ids(int id) { this.id = id; }
public int getValue() { return id; }
}
Duża różnica polega na tym, że są one bezpieczne dla typu, co oznacza, że nie musisz się martwić przypisaniem wyliczenia KOLORU do zmiennej SIZE.
Więcej informacji można znaleźć na stronie http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html .
enum class
.
Tak. Możesz przekazać wartości liczbowe do konstruktora dla wyliczenia, tak jak:
enum Ids {
OPEN(100),
CLOSE(200);
private int value;
private Ids(int value) {
this.value = value;
}
public int getValue() {
return value;
}
}
Zobacz Sun Java Język Guide , aby uzyskać więcej informacji.
value
do (powiedzmy) zera. Następnie umieść (powiedzmy) DANCE
na liście wartości.
co z użyciem tego sposobu:
public enum HL_COLORS{
YELLOW,
ORANGE;
public int getColorValue() {
switch (this) {
case YELLOW:
return 0xffffff00;
case ORANGE:
return 0xffffa500;
default://YELLOW
return 0xffffff00;
}
}
}
jest tylko jedna metoda ...
możesz użyć metody statycznej i przekazać Enum jako parametr taki jak:
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;
}
}
Zauważ, że te dwa sposoby zużywają mniej pamięci i więcej jednostek procesowych. Nie twierdzę, że to najlepszy sposób, ale to tylko inne podejście.
getColorValue()
synchronizuje się w drugim przykładzie?
HL_COLORS.getColorValue(HL_COLORS.YELLOW);
bez inicjowania wyliczenia.
Jeśli używasz bardzo dużych typów wyliczeń, następujące mogą być przydatne;
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;
}
}
Jeśli chcesz emulować wyliczanie C / C ++ (liczba podstawowa i kolejne przyrostowe):
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
Funkcja ordinal () zwraca względną pozycję identyfikatora w wyliczeniu. Możesz użyć tego do uzyskania automatycznego indeksowania z przesunięciem, jak w przypadku wyliczenia typu C.
Przykład:
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);
}
};
Daje wynik:
OPEN: 100
CLOSE: 101
OTHER: 102
Edycja: właśnie zdałem sobie sprawę, że jest to bardzo podobne do odpowiedzi ggrandesa , ale zostawię to tutaj, ponieważ jest bardzo czyste i tak blisko, jak to tylko możliwe, do osiągnięcia wyliczenia w stylu C.
@scottf
Wyliczenie jest jak Singleton. JVM tworzy instancję.
Jeśli stworzyłbyś go sam z klasami, mogłoby to wyglądać tak
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;
}
}
I może być używany w ten sposób:
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, Prawdopodobnie pomyliłeś się z powodu konstruktora zdefiniowanego w ENUM.
Pozwól mi to wyjaśnić.
Gdy class loader
ładuje enum
klasę, enum
wywoływany jest również konstruktor. Na czym !! Tak, jest wywoływany OPEN
i close
. Z jakich wartości 100
dla OPEN
i 200
dlaclose
Czy mogę mieć inną wartość?
Tak,
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; }
}
Ale to zła praktyka. enum
służy do reprezentowania constants
podobnych days of week
, colors in rainbow
tj. takiej małej grupy predefiniowanych stałych.
Myślę, że nie masz pojęcia o modułach wyliczających C ++. Moduł wyliczający Java jest inny.
Byłby to kod, jeśli jesteś przyzwyczajony do wyliczeń 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);
}
};