Java 如何使用枚举的值获取枚举

Java 如何使用枚举的值获取枚举,java,android,Java,Android,我正在开发一个Android应用程序: 我有这个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

我正在开发一个Android应用程序:

我有这个
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;
    }
}
假设我有
intgender=1
。在本例中,1是
Gender.female
的值

我想使用
gender
变量获取
gender.female
数组中
枚举的索引,该枚举由
gender.getSortedValues()返回

我想我必须使用
gender
变量来获取一个its性别表示,换句话说,获取一个带有
gender.female
作为值的枚举变量。然后,使用该enum变量搜索
Gender.getSortedValues()
。但我不知道如何使用枚举的值来获取枚举


我该怎么做?

如果您有一个整数是此枚举的
性别成员,您应该向枚举中添加一个静态方法:

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()



最后一点注意:命名int
gender
容易混淆。

如果有一个整数是此枚举的
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()



最后注意:命名int
gender
容易混淆。

删除成员字段gender。在已经完美的序号类型中引入了一个潜在的非唯一字段,这可能会导致以后的编程错误

然后,当您必须在某处序列化枚举时,只需依赖ordinal()方法。使用循环和标识比较进行查找(如fge所建议的)


对于已排序的值,请使用不可变的静态列表(或其他索引集合)而不是数组,因为这样您就可以轻松地使用list.indexOf(myEnum),并且只需排序一次。

删除成员字段。在已经完美的序号类型中引入了一个潜在的非唯一字段,这可能会导致以后的编程错误

然后,当您必须在某处序列化枚举时,只需依赖ordinal()方法。使用循环和标识比较进行查找(如fge所建议的)



对于已排序的值,请使用不可变的静态列表(或其他索引集合)而不是数组,因为这样您就可以轻松地使用list.indexOf(myEnum),并且只需排序一次。

您是否尝试并编译了此代码?由于
Arrays.sort()
values()
数组不应该是可修改的,正常情况下我的代码可以正常工作,并且编译得很好。好吧,这很奇怪。。。我想
.values()
会复制一份。到顺便说一句,不要因为有人投了反对票就删除这个问题。还有,如果fge答案解决了您的问题并且您正在使用它,为什么您不接受它?您是否尝试并编译了此代码?由于
Arrays.sort()
values()
数组不应该是可修改的,正常情况下我的代码可以正常工作,并且编译得很好。好吧,这很奇怪。。。我想
.values()
会复制一份。到顺便说一句,不要因为有人投了反对票就删除这个问题。如果fge答案解决了你的问题并且你正在使用它,为什么你不接受它呢?谢谢你的回答。我将我的int命名为
gender
,以澄清我试图做的事情。如果是为了索引,那么您最好依赖
ordinal()
,因为它存在并且有效;)@不,这不是索引。我需要那个值。这是数据库中的PK。我使用该枚举来获得pk和该pk的本地化描述。然后将其称为
primaryKey
,而不是
gender
;)谢谢你的回答。我将我的int命名为
gender
,以澄清我试图做的事情。如果是为了索引,那么您最好依赖
ordinal()
,因为它存在并且有效;)@不,这不是索引。我需要那个值。这是数据库中的PK。我使用该枚举来获得pk和该pk的本地化描述。然后将其称为
primaryKey
,而不是
gender
;)如果我删除成员字段性别。我必须使用什么来存储值0、1、。。。?枚举本身已经通过其ordinal()方法实现了这一点。如果枚举中的元素可能随时间而变化(即,如果您有一个定义汽车品牌等的枚举),则只需要像上面那样存储自己的索引。但对于性别统计,我真的无法想象根据我的经验,依赖序号()是一种不好的做法。假设一个开发人员在其他成员的中间或中间添加一个枚举元素。在许多情况下,如果删除成员字段,则显式分配标识符字段是一种良好做法(例如,在数据库中存储表示实体枚举的值时)。我必须使用什么来存储值0、1、。。。?枚举本身已经通过其ordinal()方法实现了这一点。如果枚举中的元素可能随时间而变化(即,如果您有一个定义汽车品牌等的枚举),则只需要像上面那样存储自己的索引。但对于性别统计,我真的无法想象根据我的经验,依赖序号()是一种不好的做法。假设一个开发人员在其他成员的中间或中间添加一个枚举元素。在许多情况下,显式分配标识符字段是一种良好做法(例如,在数据库中存储表示实体枚举的值时)