Bardzo dobrze znam C #, ale zaczynam więcej pracować w Javie. Spodziewałem się, że wyliczenia w Javie są w zasadzie równoważne z tymi w C #, ale najwyraźniej tak nie jest. Początkowo byłem podekscytowany, gdy dowiedziałem się, że wyliczenia Java mogą zawierać wiele fragmentów danych, co wydaje się bardzo korzystne ( http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html ). Jednak od tego czasu odkryłem, że brakuje wielu funkcji, które są trywialne w C #, takich jak możliwość łatwego przypisania elementowi wyliczenia określonej wartości, aw konsekwencji możliwość konwersji liczby całkowitej na wyliczenie bez przyzwoitego wysiłku ( tj. Konwertuj wartość całkowitą na pasującą wartość Java Enum ).
Więc moje pytanie brzmi: czy wyliczenia Java mają jakąś korzyść w porównaniu z klasą z kilkoma publicznymi statycznymi polami końcowymi? A może po prostu zapewnia bardziej zwartą składnię?
EDYCJA: Pozwól, że wyrażę się bardziej jasno. Jaka jest przewaga wyliczeń Java w porównaniu z klasą z kilkoma publicznymi statycznymi polami końcowymi tego samego typu ? Na przykład w przykładzie planet w pierwszym łączu, jaka jest przewaga wyliczenia nad klasą z tymi stałymi publicznymi:
public static final Planet MERCURY = new Planet(3.303e+23, 2.4397e6);
public static final Planet VENUS = new Planet(4.869e+24, 6.0518e6);
public static final Planet EARTH = new Planet(5.976e+24, 6.37814e6);
public static final Planet MARS = new Planet(6.421e+23, 3.3972e6);
public static final Planet JUPITER = new Planet(1.9e+27, 7.1492e7);
public static final Planet SATURN = new Planet(5.688e+26, 6.0268e7);
public static final Planet URANUS = new Planet(8.686e+25, 2.5559e7);
public static final Planet NEPTUNE = new Planet(1.024e+26, 2.4746e7);
O ile wiem, odpowiedź Casablanki jest jedyną, która to spełnia.
S
, więc teraz mówimy o prawdopodobnie przekazywaniu ich do funkcji itp. Czy potrzebujemy bezpieczeństwa typów? Cóż, nie, ale większość ludzi uważa, że „wszystko jest w void*
dobrym stylu” w stylu c i może to powstrzymać błędy (zwłaszcza jeśli przekazuje więcej niż jeden parametr wyliczenia / ciągu znaków!). Umieszcza również stałe w ich własnej przestrzeni nazw, itp. W przeciwieństwie do tego, posiadanie zwykłych zmiennych nie ma prawdziwej korzyści.
int
s nie ma bezpieczeństwa typu, ponieważ można przekazać dowolną wartość. Z drugiej strony obiekty typowane nie różnią się od wyliczeń pod względem bezpieczeństwa typów.
public static final
polach, które mogą być wpisanymi wartościami, a niekoniecznieint
s.