Czy ==
mogę używać na wyliczeniach w Javie, czy muszę używać .equals()
? W moich testach ==
zawsze działa, ale nie jestem pewien, czy to gwarantuje. W szczególności nie ma .clone()
metody na wyliczeniu, więc nie wiem, czy można uzyskać wyliczenie, dla którego zwróciłoby .equals()
inną wartość niż ==
.
Na przykład, czy to jest w porządku:
public int round(RoundingMode roundingMode) {
if(roundingMode == RoundingMode.HALF_UP) {
//do something
} else if (roundingMode == RoundingMode.HALF_EVEN) {
//do something
}
//etc
}
Czy też muszę napisać to w ten sposób:
public int round(RoundingMode roundingMode) {
if(roundingMode.equals(RoundingMode.HALF_UP)) {
//do something
} else if (roundingMode.equals(RoundingMode.HALF_EVEN)) {
//do something
}
//etc
}
Odpowiedzi:
Tylko moje 2 centy: Oto kod Enum.java opublikowany przez Sun i część JDK:
źródło
Tak, == jest w porządku - istnieje gwarancja, że dla każdej wartości będzie tylko jedno odwołanie.
Istnieje jednak lepszy sposób na zapisanie metody rundy:
Jeszcze lepszym sposobem na zrobienie tego jest umieszczenie funkcji w samym wyliczeniu, więc możesz po prostu zadzwonić
roundingMode.round(someValue)
. Dochodzi do sedna wyliczeń Java - są to wyliczenia obiektowe , w przeciwieństwie do „nazwanych wartości”, które można znaleźć gdzie indziej.EDYCJA: specyfikacja nie jest zbyt jasna, ale sekcja 8.9 mówi:
źródło
Tak, to tak, jakbyś utworzył pojedyncze wystąpienia dla każdej wartości w wyliczeniu:
Jednak The
enum
konstrukcja daje wiele korzyści:switch-case
pomocą struktury kontrolnej.values
pola, które jest „generowane” dla każdego typu wyliczeniaSerializacja to duży problem. Gdybym miał użyć powyższego kodu zamiast wyliczenia, oto jak zachowałaby się równość tożsamości:
Państwo może rozwiązać ten problem bez wyliczenia, stosując technikę, która obejmuje
writeReplace
ireadResolve
, (patrz http://java.sun.com/j2se/1.4.2/docs/api/java/io/Serializable.html ) ...Chyba chodzi o to, że Java robi wszystko, co w jej mocy, aby umożliwić używanie tożsamości wartości wyliczeniowych do testowania równości; jest to zalecana praktyka.
źródło
== porównuje odwołania do dwóch obiektów. W przypadku wyliczeń gwarantuje się, że będzie tylko jedno wystąpienie, a zatem dla dowolnych dwóch takich samych wyliczeń == będzie prawdziwe.
Odniesienie:
http://www.ajaxonomy.com/2007/java/making-the-most-of-java-50-enum-tricks
(nie można znaleźć niczego w dokumentach Sun)
źródło
Oto zły kod, który może Cię zainteresować. :RE
źródło
Unsafe.class
.Wyliczenia to świetne miejsce do zakleszczenia kodu polimorficznego.
źródło
Zauważ, że występuje problem podczas przesyłania wyliczenia przez RMI / IIOP. Zobacz ten wątek:
http://www.velocityreviews.com/forums/t390342-enum-equality.html
źródło
== jest generalnie w porządku, a oba znaki mają zalety
.equals()
. Osobiście wolę zawsze używać.equals()
podczas porównywania obiektów, w tymenum
s. Zobacz także tę dyskusję:Porównanie elementów wyliczenia Java: == lub equals ()?
źródło