Работа с перечислениями в 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;
}
}


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

564   7  

7 ответов:

где вы нашли этот синтаксис? Перечисления 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;
    }
}

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

Gender me = Gender.MALE

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

I цитата:

будьте в курсе накладных расходов памяти

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

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

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

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

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

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

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

Как прокомментировал Крис, перечисления требуют гораздо больше памяти на 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);

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

EDIT: кажется, что преобразование перечислений в ints - это один из значений по умолчанию оптимизации должны быть.

public enum Gender {
    MALE,
    FEMALE
}

по этому видео Если вы используете ProGuard вам не нужно даже думать о проблемах производительности перечислений!!

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

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

предпочтительный подход 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;
  }
}

Docs:https://developer.android.com/studio/write/annotations.html#enum-annotations

Comments

    Ничего не найдено.