2013-07-13 2 views
0

Я разработки Android приложения:Как получить Enum, используя его значение

Я это Enum:

public enum Gender 
{ 
    male (0, MyApplication.getAppContext().getString(R.string.male)), 
    female (1, MyApplication.getAppContext().getString(R.string.female)); 

    private final int gender; 
    private final String description; 
    Gender(int aGender, String aDescription) 
    { 
     gender = aGender; 
     description = aDescription; 
    } 

    public int getValue() { return gender; } 

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

    /** 
    * Returns all values in this Enum sorted alphabetically by 
    * description. 
    * @return All values sorted. 
    */ 
    public static Gender[] getSortedVaules() 
    { 
     Gender[] sorted = values(); 
     Arrays.sort(sorted, EnumByNameComparator.INSTANCE); 
     return sorted; 
    } 
} 

Представьте меня int gender = 1. В этом случае 1 является значением для Gender.female.

Я хочу использовать gender переменную, чтобы получить индекс Gender.female перечисления в array возвращенное Gender.getSortedValues().

Я думаю, что мне нужно использовать переменную gender, чтобы получить ее представление Gender, другими словами, чтобы получить переменную enum с Gender.female как значение. И затем, используйте эту переменную перечисления для поиска по Gender.getSortedValues(). Но я не знаю, как получить перечисление, используя его ценность.

Как я могу это сделать?

+0

Вы пробовали и скомпилировали этот код? Я не уверен, что он компилируется из-за 'Arrays.sort()': массив 'values ​​()' не должен быть модифицируемым, обычно – fge

+0

Мой код работает и компилируется отлично. – VansFannel

+0

ОК, это странно ... Я думаю, '.values ​​()' делает копию тогда. – fge

ответ

3

Если у вас есть целое число, которое является gender члена этого перечисления, вы должны добавить статический метод к вашему перечислимому:

public static Gender getByInt(final int i) 
{ 
    for (final Gender g: values()) 
     if (g.gender == i) 
      return g; 
    return null; // not found 
} 

Затем вы звоните Gender.getByInt(...);.

Но Enum также имеет .valueOf(): Enum.valueOf(Gender.class, "male") или Gender.valueOf("male") например; будьте осторожны, что он выбрасывает IllegalArgumentException, если такого значения нет.

Также читайте о .ordinal(). Javadoc for Enum.


окончательное примечание: присвоение имени int gender сбивает с толку.

+0

Спасибо за ваш ответ. Я называю свой int 'gender', чтобы уточнить, что я пытаюсь сделать. – VansFannel

+0

Если это для индексации, тогда вам лучше полагаться на 'порядковый()', поскольку он существует и работает;) – fge

+0

+1 ... perfect :) –

0

Удалите поле поля члена. Вы вводите потенциально не уникальное поле в уже совершенном порядковом типе, что впоследствии может привести к ошибкам программирования.

Затем просто полагайтесь на метод ordinal(), когда вам нужно сериализовать перечисление где-нибудь. Используйте сравнение циклов и идентичности для поиска (как предложено fge).

Для отсортированных значений используйте неизменный статический список (или другую индексированную коллекцию) вместо массива, потому что тогда вы можете легко использовать list.indexOf (myEnum) и сортировать только один раз.

+0

Если я удалю пол поля элемента. Что мне нужно использовать для хранения значений 0, 1, ...? – VansFannel

+0

http://stackoverflow.com/a/5021384/44089 Само перечисление уже имеет это по методу ordinal(). Вам нужно только сохранить собственный индекс, как вы уже выше, если элементы в перечислении могут меняться со временем (т. Е. Если у вас есть перечисление, определяющее марки автомобилей или тому подобное). Но для гендерного перечисления я не могу этого себе представить. :) – Bananeweizen

+0

По моему опыту, полагаясь на порядковый номер(), это плохая практика. Представьте, что разработчик добавляет элемент перечисления до или в середине других членов. Явное назначение поля идентификатора во многих случаях является хорошей практикой (например, при хранении в базе данных, значение для представления перечисления для объекта) – dkateros

Смежные вопросы