W górnej odpowiedzi znajduje się definicja wyliczenia. Chciałbym przykład użycia tego zdefiniowanego wyliczenia w kodzie. Na przykład, w jaki sposób zdefiniowany ctor mógłby zostać użyty do utworzenia wystąpienia enum z określoną wartością całkowitą.
ScottF
@ ScottF, gdybym był tobą, zamiast ustawiać nagrodę za ten post, wolałbym zamieścić zupełnie nowe pytanie ..... lub przeczytać dokumentację dotyczącą wyliczeń. Wygląda na to, że musisz
zdobyć
enum ids {OPEN = 100, CLOSE};?
Pan Oscar
Odpowiedzi:
307
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.
Opierając się na twoim oświadczeniu, najlepszą praktyką przy użyciu java do utworzenia wyliczenia liczb całkowitych sekwencyjnych (podobnych do wyliczenia C ++), dla indeksu w tablicy lub czegoś takiego, byłoby napisanie: wyliczanie Ids {NAME (0), AGE (1 ), WYSOKOŚĆ (2), WAGA (3); } Dziękuję, -bn
bn.
Być może, a zwłaszcza jeśli gdzieś szeregujesz wartości całkowite.
lavinio
1
czy możesz powiedzieć, jak używać tego wyliczenia w funkcji?
Błędy występowały
2
Leniwe jest, aby standardy Java nie pozwalały na ustawienie wartości dla wyliczenia. Przynajmniej c # pozwala na to ORAZ jest bezpieczny dla typu.
csmith
2
FWIW, C ++ 11 ma teraz bezpieczny typ enum class.
feniks
92
Tak. Możesz przekazać wartości liczbowe do konstruktora dla wyliczenia, tak jak:
Chłodny. Czy można mieszać? Tj. Przypisuj tylko liczby do wybranych wartości Enum.
Frederick Nord,
prywatny modyfikator jest zbędny dla konstruktorów enum
Nino van Hooff
@FrederickNord - Pewnie. Wystarczy dodać drugi prywatny konstruktor bez argumentów, który inicjuje się valuedo (powiedzmy) zera. Następnie umieść (powiedzmy) DANCEna liście wartości.
Dlaczego getColorValue()synchronizuje się w drugim przykładzie?
josaphatv
@josaphatv Cała funkcjonalność w drugim przykładzie jest statyczna, nigdy się nie zmienia. Możesz chcieć HL_COLORS.getColorValue(HL_COLORS.YELLOW);bez inicjowania wyliczenia.
mazunki
11
Jeśli używasz bardzo dużych typów wyliczeń, następujące mogą być przydatne;
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.
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.
W tym przykładzie bierzesz wyliczenie i dostajesz int. Czy potrafisz pokazać odwrotność, wziąć int i skończyć enumem (bez wyraźnego przypadku zmiany dla każdej wartości?)
ScottF
Jeśli chodzi o pytanie, uważam, że jest to najbardziej odpowiednia odpowiedź. W tym miejscu zmieniliśmy domyślny indeks wyliczenia, aby zaczynał się od 100 bez definiowania nowej zmiennej i przypisywania jej za pomocą konstruktora.
Rahul Jain
@RahulJain Wolę użyć zaakceptowanej odpowiedzi. Wydaje mi się czystszy.
lealceldeiro
1
@scottf
Wyliczenie jest jak Singleton. JVM tworzy instancję.
Jeśli stworzyłbyś go sam z klasami, mogłoby to wyglądać tak
publicstaticclassMyEnum{finalpublicstaticMyEnum ONE;finalpublicstaticMyEnum TWO;static{
ONE =newMyEnum("1");
TWO =newMyEnum("2");}finalString enumValue;privateMyEnum(String value){
enumValue = value;}@OverridepublicString toString(){return enumValue;}}
I może być używany w ten sposób:
publicclassHelloWorld{publicstaticclassMyEnum{finalpublicstaticMyEnum ONE;finalpublicstaticMyEnum TWO;static{
ONE =newMyEnum("1");
TWO =newMyEnum("2");}finalString enumValue;privateMyEnum(String value){
enumValue = value;}@OverridepublicString toString(){return enumValue;}}publicstaticvoid 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");}}
@ scottf, Prawdopodobnie pomyliłeś się z powodu konstruktora zdefiniowanego w ENUM.
Pozwól mi to wyjaśnić.
Gdy class loaderładuje enumklasę, enumwywoływany jest również konstruktor. Na czym !! Tak, jest wywoływany OPENi close. Z jakich wartości 100dla OPENi 200dlaclose
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.
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 .
źródło
enum class
.Tak. Możesz przekazać wartości liczbowe do konstruktora dla wyliczenia, tak jak:
Zobacz Sun Java Język Guide , aby uzyskać więcej informacji.
źródło
value
do (powiedzmy) zera. Następnie umieść (powiedzmy)DANCE
na liście wartości.co z użyciem tego sposobu:
jest tylko jedna metoda ...
możesz użyć metody statycznej i przekazać Enum jako parametr taki jak:
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.
źródło
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;
źródło
Jeśli chcesz emulować wyliczanie C / C ++ (liczba podstawowa i kolejne przyrostowe):
źródło
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:
Daje wynik:
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.
źródło
@scottf
Wyliczenie jest jak Singleton. JVM tworzy instancję.
Jeśli stworzyłbyś go sam z klasami, mogłoby to wyglądać tak
I może być używany w ten sposób:
źródło
@ scottf, Prawdopodobnie pomyliłeś się z powodu konstruktora zdefiniowanego w ENUM.
Pozwól mi to wyjaśnić.
Gdy
class loader
ładujeenum
klasę,enum
wywoływany jest również konstruktor. Na czym !! Tak, jest wywoływanyOPEN
iclose
. Z jakich wartości100
dlaOPEN
i200
dlaclose
Czy mogę mieć inną wartość?
Tak,
Ale to zła praktyka.
enum
służy do reprezentowaniaconstants
podobnychdays of week
,colors in rainbow
tj. takiej małej grupy predefiniowanych stałych.źródło
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 ++:
źródło