2010-09-29 12 views
88

Mam enum SOME_ENUM:enum.values ​​() - jest kolejność zwracanych teksty stałe deterministyczny

public enum SOME_ENUM { 
    EN_ONE, 
    EN_TWO, 
    EN_THREE; 
} 

Will SOME_ENUM.values() zawsze zwraca stałe teksty w kolejności zgłoszeń ENUM: EN_ONE, EN_TWO, EN_THREE? Czy jest to reguła, czy nie ma gwarancji, że nie zostanie zmieniona w następnych wydaniach JDK?

+1

dlaczego miałbyś na tym polegać? –

+1

Powtarzam po moim wyliczeniu, aby wypełnić listę, która niż w innym miejscu w kodzie przeczytałem, powtarzając ten wyliczenie. – Skarab

+11

@MitchWheat Z tego samego powodu, dla którego powinieneś polegać na kolejności zachowywania listy: ponieważ JDK to narzędzie, które daje pewne gwarancje i polegając na tych gwarancjach pomaga ci pisać bardziej zwięzły i lepszy kod. Oczywiście pytanie "Czy to się nie zmienia?" nie da się odpowiedzieć, na pewno nie można na tym polegać, nic nie ma tej gwarancji. – Fletch

Odpowiedz

126

specyfikacji języka Java używa tego wyraźny język:

@return tablicy zawierającej stałe tego typu enum w kolejności są one uznane [Source]

Tak, tak , zostaną zwrócone w kolejności deklaracji. Warto zauważyć, że kolejność może się zmieniać w miarę upływu czasu, jeśli ktoś zmieni klasę, więc należy bardzo uważać, jak z niej korzystasz.

+1

Jeśli ktoś doda wartość pośrodku w późniejszej wersji kodu, może to spowodować wzrost liczby porządkowej innych elementów (patrz metoda Enum.ordinal()). Najlepiej nie polegać na pozycji porządkowej jako na mechanizmie serializacji (tj. Nie przechowywać go w bazie danych) z tego powodu. – Matt

+1

Link do źródła tej specyfikacji? – screenmutt

+0

[Java 8 doc] (http://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.9.3) –

14

Tak, gwarantowane jest zwrócenie ich w tej kolejności.

Należy jednak unikać polegania na tym i na wartości ordinal(), ponieważ może ona ulec zmianie po wstawieniu nowych elementów, na przykład.

+0

+1 za poradę mędrca.Na temat metody ordinal(), efektywna Java sugeruje dodanie pola elementu do typu wyliczeniowego. – ide

9

Jest określana w kolejności, w jakiej są zadeklarowane twoje wartości. Jednakże, nie ma żadnej gwarancji, że ty (lub ktoś inny) nie będzie zmieniać/wstawiać/usuwać wartości w przyszłości. Nie powinieneś więc polegać na zamówieniu.

Efektywne Java 2nd. Wydanie poświęca swój produkt 31 do ściśle powiązany temat: używać pól instancji zamiast porządkowych:

Nigdy czerpać wartości związanej z enum od jego porządkowej; przechowuj go w polu instancji.

+3

"Nie ma gwarancji, że ktoś nie będzie zmieniać kolejności wartości w przyszłości" - ale właśnie dlatego chcę polegać na zamówieniu :-)! Chcę móc ponownie zamówić elementy w przyszłości, a tym samym zmienić zachowanie mojego programu. Bloch ma rację, nie polegając na liczbie porządkowej i jeśli przykład osoby pytającej naprawdę zawiera wyliczenia takie jak EN_TWO, to opiera się na liczbie porządkowej i nie powinien tego robić. Ale poleganie na zamówieniu jest całkowicie w porządku. W rzeczywistości, zgodnie z porządkiem, stworzenie pola specjalnie dla porządku byłoby pisaniem redundantnego kodu, takie książki, jak efektywna Java, nie powinny tego robić. – Fletch

+0

@Fletch, przepraszam, nie podążam za tobą. Dla mnie brzmi to jak próbujesz użyć 'enum' dla jakiegoś celu, dla którego nie był przeznaczony. –

+0

Załóżmy, że masz słynną enum "Planet". W interfejsie użytkownika chcesz wyświetlić planety w kolejności ich odległości od Słońca. Jak możesz to najlepiej osiągnąć? Zamówiłbym stałe planety we właściwej kolejności wewnątrz klasy wyliczeniowej, a następnie wyliczyłem wyliczenie w interfejsie użytkownika. Ponieważ zamówienie jest niezawodne, to zadziała. O tym właśnie mówię. Jeśli pewnego dnia Ziemia zbliży się do Słońca niż Mars, oczywiście w takiej chwili pierwsza rzecz na twoim ciepłym umyśle będzie utrzymywać twój kod! Więc idziesz na swoją Planetę i poruszasz ZIEMIĄ przed MARS. – Fletch

7

innych odpowiedzi są dobre, ale nie komentować to: „Czy jest to reguła czy to nie jest gwarantowane nie można zmienić w następnym jdk wypuszcza”

Nie wierzę, że gwarancje na przyszłe pakiety JDK istnieją, więc nie powinieneś się o nie martwić. Nie można ich egzekwować, a przyszli przewodnicy JDK mogą po prostu zdecydować się na renegocjowanie takich gwarancji. To jak parlamentarny system Westminster: "Żaden parlament nie może związać przyszłego parlamentu".

To powiedziawszy, historia JDK ujawnia doskonałą konsystencję. Nie wprowadzają wielu przełomowych zmian, więc możesz być pewny, że bieżące zachowanie określone jako (nie tylko obserwowane) zostanie zachowane.

Powiązane problemy