Работа с Enums в android

Я почти закончил работу по вычислению, с которой я работаю в android для своего приложения. Я пытаюсь создать генератор пол, но почему-то получив Синтаксическую ошибку, вставьте "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;
    }
}

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

Ответ 1

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

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

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

Gender me = Gender.MALE

Ответ 2

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

Я цитирую:

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

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

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

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

  • Каждый экземпляр класса имеет 12-16 байт ОЗУ.

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

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

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

Ответ 3

Как прокомментировал Крис, перечисления требуют гораздо больше памяти на 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. Кажется, что преобразование enums в ints является одной из оптимизаций по умолчанию в Proguard.

Ответ 4

public enum Gender {
    MALE,
    FEMALE
}

Ответ 5

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

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

Ответ 6

Перечисления не рекомендуются для проблем с производительностью, вместо этого используйте примитивные константы. https://www.youtube.com/watch?v=Hzs6OBcvNQE

Ответ 7

Предпочитаемый подход 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