Работа с Enums в Android - PullRequest
       1

Работа с Enums в Android

112 голосов
/ 12 февраля 2012

Я почти закончил с вычислением активности, с которой я работаю в Android для моего приложения.Я пытаюсь создать Gender Enum, но по какой-то причине получаю синтаксическую ошибку, вставьте "EnumBody" для завершения EnumDeclaration.

public static enum Gender
{
    static
    {
        Female = new Gender("Female", 1);
        Gender[] arrayOfGender = new Gender[2];
        arrayOfGender[0] = Male;
        arrayOfGender[1] = Female;
        ENUM$VALUES = arrayOfGender;
    }
}

Я также пробовал без статического {}, ноЯ получаю ту же синтаксическую ошибку.

Ответы [ 6 ]

322 голосов
/ 12 февраля 2012

Где на земле вы нашли этот синтаксис? Перечисления Java очень просты, вы просто указываете значения.

public enum Gender {
   MALE,
   FEMALE
}

Если вы хотите, чтобы они были более сложными, вы можете добавить значения к ним следующим образом.

public enum Gender {
    MALE("Male", 0),
    FEMALE("Female", 1);

    private String stringValue;
    private int intValue;
    private Gender(String toString, int value) {
        stringValue = toString;
        intValue = value;
    }

    @Override
    public String toString() {
        return stringValue;
    }
}

Затем, чтобы использовать enum, вы должны сделать что-то вроде этого:

Gender me = Gender.MALE
48 голосов
/ 03 октября 2014

Вокруг этого спора были некоторые споры, но даже в самых последних документах Android предполагает, что использование перечислений в приложениях для Android не очень хорошая идея. Причина в том, что они используют больше памяти, чем статическая переменная констант. Вот документ со страницы 2014 года, который запрещает использование перечислений в приложениях для Android. http://developer.android.com/training/articles/memory.html#Overhead

Цитирую:

Помните о нехватке памяти

Быть осведомленным о стоимости и накладных расходах языка и библиотеки, которые вы используете, и помните эту информацию, когда вы Создайте свое приложение от начала до конца. Часто вещи на поверхности этот безобидный вид может на самом деле иметь большое количество накладных расходов. Примеры включают в себя:

  • Перечисления часто требуют в два раза больше памяти, чем статические константы. Вы должны строго избегать использования перечислений на Android.

  • Каждый класс в Java (включая анонимные внутренние классы) использует около 500 байтов кода.

  • Каждый экземпляр класса имеет 12-16 байтов служебной памяти.

  • Помещение одной записи в HashMap требует выделения дополнительный входной объект, который занимает 32 байта (см. предыдущий раздел о оптимизированные контейнеры данных).

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

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

21 голосов
/ 26 марта 2015

Как прокомментировал Крис, перечисления требуют намного больше памяти на Android, которая увеличивается, поскольку они продолжают использоваться везде.Вместо этого вы должны попробовать IntDef или StringDef , которые используют аннотации, чтобы компилятор проверял переданные значения.

public abstract class ActionBar {
...
@IntDef({NAVIGATION_MODE_STANDARD, NAVIGATION_MODE_LIST, NAVIGATION_MODE_TABS})
@Retention(RetentionPolicy.SOURCE)
public @interface NavigationMode {}

public static final int NAVIGATION_MODE_STANDARD = 0;
public static final int NAVIGATION_MODE_LIST = 1;
public static final int NAVIGATION_MODE_TABS = 2;

@NavigationMode
public abstract int getNavigationMode();

public abstract void setNavigationMode(@NavigationMode int mode);

Это также можно использовать в качестве флагов, что позволяетдвоичная композиция (операции OR / AND).

EDIT : похоже, преобразование перечислений в целые числа является одной из оптимизаций по умолчанию в Proguard .

17 голосов
/ 12 февраля 2012
public enum Gender {
    MALE,
    FEMALE
}
8 голосов
/ 28 декабря 2015

Согласно этому Видео , если вы используете ProGuard, вам не нужно даже думать о проблемах производительности Enums !!

Proguard может во многих ситуациях оптимизировать Enums до значений INTот вашего имени, так что действительно не нужно думать об этом или делать какую-либо работу.

3 голосов
/ 22 апреля 2017

В Android предпочтительнее использовать int-константы, которые применяются с помощью @IntDef:

public static final int GENDER_MALE = 1;
public static final int GENDER_FEMALE = 2;

@Retention(RetentionPolicy.SOURCE)
@IntDef ({GENDER_MALE, GENDER_FEMALE})
public @interface Gender{}

// Example usage...
void exampleFunc(@Gender int gender) {
  switch(gender) {
  case GENDER_MALE:

     break;
  case GENDER_FEMALE:
     // TODO
     break;
  }
}

Документы: https://developer.android.com/studio/write/annotations.html#enum-annotations

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