Я очень знаком с C #, но начинаю больше работать на Java. Я ожидал узнать, что перечисления в Java в основном эквивалентны перечислениям в C #, но, очевидно, это не так. Первоначально я был рад узнать, что перечисления Java могут содержать несколько фрагментов данных, что представляется очень полезным ( http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html ). Однако с тех пор я обнаружил, что в C # отсутствуют многие функции, тривиальные, такие как возможность легко назначать элементу enum определенное значение и, следовательно, возможность преобразовать целое число в enum без приличных усилий ( т.е. преобразование целочисленного значения в соответствующее Java Enum ).
Итак, мой вопрос заключается в следующем: есть ли какая-либо польза для перечислений Java по сравнению с классом с множеством открытых статических полей final? Или это просто обеспечивает более компактный синтаксис?
РЕДАКТИРОВАТЬ: Позвольте мне быть более ясным. В чем преимущество перечислений Java над классом с набором открытых статических полей final одного типа ? Например, в примере с планетами в первой ссылке, в чем преимущество перечисления перед классом с этими открытыми константами:
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);
Насколько я могу судить, ответ Касабланки - единственный, который удовлетворяет это.
S
, так что теперь мы говорим о , вероятно , передавая их в функции и т.д. У нас нужно вводить-Техника безопасности? Ну, нет, но тогда большинство людей считают, что типы в стиле c "все это void*
" хороший стиль, и это может остановить ошибки (особенно если передается более одного параметра enum / string!). Кроме того, он помещает константы в их собственное пространство имен и т. Д. В противоположность этому, просто иметь простые переменные не дает реального преимущества.
int
s нет безопасности типов, потому что можно передать любое значение. Типизированные объекты, с другой стороны, ничем не отличаются от перечислений с точки зрения безопасности типов.
public static final
поля, которые могут быть типизированными значениями и не обязательноint
s.