В чем преимущество перечисления Java по сравнению с классом с открытыми статическими полями final? - PullRequest
128 голосов
/ 02 апреля 2012

Я очень знаком с C #, но начинаю больше работать на Java. Я ожидал узнать, что перечисления в Java в основном эквивалентны перечислениям в C #, но, очевидно, это не так. Вначале я был рад узнать, что перечисления Java могут содержать несколько фрагментов данных, что кажется очень полезным (http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html). Однако с тех пор я обнаружил, что многие функции отсутствуют, которые являются тривиальными в C #, например, возможность легко присваивать элементу enum определенное значение и, следовательно, возможность преобразовывать целое число в перечисление без приличных усилий (т. е. Преобразовать целочисленное значение в соответствующее Enum Java ).

Итак, мой вопрос заключается в следующем: есть ли какая-то польза для перечислений Java по сравнению с классом с множеством открытых статических полей final? Или он просто обеспечивает более компактный синтаксис?

РЕДАКТИРОВАТЬ: Позвольте мне быть более ясным. В чем преимущество перечислений Java над классом с набором открытых статических полей того же типа ? Например, в примере с планетами в первой ссылке, в чем преимущество перечисления перед классом с этими открытыми константами:

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);

Насколько я могу судить, ответ Касабланки - единственный, который удовлетворяет этому.

Ответы [ 14 ]

3 голосов
/ 03 мая 2016

Другое важное отличие заключается в том, что java-компилятор обрабатывает static final поля примитивных типов и String как литералы. Это означает, что эти константы становятся встроенными. Это похоже на препроцессор C/C++ #define. См. этот ТАК вопрос . Это не относится к перечислениям.

2 голосов
/ 17 сентября 2016

Самым большим преимуществом является enum. Singletons просты в написании и поточнобезопасны:

public enum EasySingleton{
    INSTANCE;
}

и

/**
* Singleton pattern example with Double checked Locking
*/
public class DoubleCheckedLockingSingleton{
     private volatile DoubleCheckedLockingSingleton INSTANCE;

     private DoubleCheckedLockingSingleton(){}

     public DoubleCheckedLockingSingleton getInstance(){
         if(INSTANCE == null){
            synchronized(DoubleCheckedLockingSingleton.class){
                //double checking Singleton instance
                if(INSTANCE == null){
                    INSTANCE = new DoubleCheckedLockingSingleton();
                }
            }
         }
         return INSTANCE;
     }
}

оба похожи, и они сами обрабатывают сериализацию путем реализации

//readResolve to prevent another instance of Singleton
    private Object readResolve(){
        return INSTANCE;
    }

больше

2 голосов
/ 02 апреля 2012

Вы получаете проверку времени компиляции действительных значений при использовании перечисления. Посмотрите на этот вопрос.

0 голосов
/ 27 декабря 2013

Я думаю, enum не может быть final, потому что компилятор под капотом генерирует подклассы для каждой записи enum.

Дополнительная информация из source

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...