Подтвердить что ты не робот

Android: enum vs static final ints?

Каковы преимущества (или недостатки) наличия enum по сравнению с набором static final int в приложениях Java Android? Существуют ли эффективные или эффективные оптимизации, которые способствуют использованию одного или другого?

Я спрашиваю об этом в контексте, например, requestCodes и т.д., которые, как правило, являются ints в коде кода Android, в отличие от значений из перечисления, к которым я был использован в C.

4b9b3361

Ответ 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. Я попытался восстановить здесь.