Android: enum против статических окончательных значений? - PullRequest
31 голосов
/ 10 марта 2011

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

Я спрашиваю это в контексте, скажем, намеренных requestCodes и тому подобного - которые, как правило, являются целочисленными значениями в примере кода Android, в отличие от значений из перечисления, к которому я привык в C.

Ответы [ 4 ]

29 голосов
/ 10 марта 2011

Enum преимущества от этого вопроса :

  • Они гораздо более безопасны для типов, чем целые числа, строки или наборы логических флагов.
  • Они приводят к более читабельному коду.
  • Труднее установить для перечисления недопустимое значение, чем для типа int или строки.
  • Они позволяют легко находить допустимые значения для переменной илипараметр.
  • Все, что я прочитал, показывает, что они работают так же хорошо, как и целые числа в C # и большинстве виртуальных машин Java.

Я бы добавил:

  • Перечисления могут иметь переменные-члены и экземпляры, тогда как int не может.

Как и большинство абстракций, они, как правило, однозначно выгодны, когда их производительность достигает .Особенно в коде вашего приложения (в отличие от кода фреймворка) я бы предпочел перечисления другим методам, имитирующим их.

12 голосов
/ 10 марта 2011

Очень простой ответ из личного опыта состоит в том, что Enums обеспечивают гораздо лучшую безопасность типов, или, другими словами, компилятор играет более активную роль в обеспечении безопасности вашего кода.

С другой стороны, поскольку Enums являются "гражданами второго сорта" в объектном мире, их может быть сложно использовать в некоторых из более тонких шаблонов проектирования, обычно используемых сегодня, особенно когда используются дженерики.

И, наконец, вы можете использовать статические финальные целые в битовом поле. Вы не можете сделать следующее с перечислением:

int selectedOptions = Options.OPTION1 | Options.OPTION2 | Options.OPTION3;
7 голосов
/ 09 июня 2015

Ну ... по словам лысый парень Перечисления действительно вредны для памяти .

Вы должны использовать @ 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);
3 голосов
/ 10 марта 2011

Одним из преимуществ целых по сравнению с перечислениями является класс завода.Следующий код C # не является расширяемым:

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

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