Android: enum vs static final ints?
Каковы преимущества (или недостатки) наличия enum
по сравнению с набором static final int
в приложениях Java Android? Существуют ли эффективные или эффективные оптимизации, которые способствуют использованию одного или другого?
Я спрашиваю об этом в контексте, например, requestCodes и т.д., которые, как правило, являются ints в коде кода Android, в отличие от значений из перечисления, к которым я был использован в C.
Ответы
Ответ 1
Перечислите преимущества этого вопроса:
- Они гораздо более безопасны по типу, чем целые числа, строки или наборы логических флаги.
- Они приводят к более читаемому коду.
- Сложнее установить перечисление на недопустимое значение, чем int или строка.
- Они позволяют легко обнаружить допустимые значения для переменной или параметр.
- Все, что я прочитал, указывает, что они выполняют так же, как и целые числа в С# и большинстве JVM.
Я бы добавил:
- Перечисления могут иметь переменные члена и экземпляра, тогда как
int
не может.
Как и большинство абстракций, они, как правило, недвусмысленно выгодны, как только их догоняет. Особенно в вашем коде приложения (в отличие от кода фреймворка) я бы выбрал перечисления по другим методам, имитирующим их.
Ответ 2
Очень простой ответ из личного опыта будет заключаться в том, что Enums обеспечивают гораздо лучшую безопасность типа или, другими словами, компилятор получает более активную роль в сохранении вашей ошибки кода.
С другой стороны, поскольку Enums являются "гражданами второго сорта" в объектном мире, их может быть сложно использовать в некоторых более тонких шаблонах дизайна, которые обычно используются сегодня, особенно когда задействованы дженерики.
И, наконец, вы можете использовать статические final ints в битовом поле. вы не могли сделать следующее с перечислением:
int selectedOptions = Options.OPTION1 | Options.OPTION2 | Options.OPTION3;
Ответ 3
Ну... согласно лысый парень Enums очень плохо для памяти.
Вы должны использовать @IntDef/@StringDef аннотации:
public static final int NAVIGATION_MODE_STANDARD = 0;
public static final int NAVIGATION_MODE_LIST = 1;
public static final int NAVIGATION_MODE_TABS = 2;
@IntDef({NAVIGATION_MODE_STANDARD, NAVIGATION_MODE_LIST, NAVIGATION_MODE_TABS})
public @interface NavigationMode {}
а затем
@NavigationMode
public abstract int getNavigationMode();
public abstract void setNavigationMode(@NavigationMode int mode);
Ответ 4
Одно из преимуществ ints над перечислениями - это CLASS FACTORY. Следующий код С# не расширяется:
class Factory
{
public enum DrawableType {CIRCLE,SQUARE};
public static Drawable GetInstance(DrawableEnum e)
{
if (e == DrawableType.CIRCLE)
{
return new Circle();
}
else if (e == DrawableType.SQUARE)
{
return new Square();
}
else
{
throw new IndexOutOfRangeException(); // should never get here
}
}
Я написал этот плохой код. Рассматривая шаблоны проектирования, банда из четырех человек использовала int. Я попытался восстановить здесь.