【问题标题】:How to get an Enum using its value如何使用枚举值获取枚举
【发布时间】:2013-07-13 09:31:14
【问题描述】:

我正在开发一个 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;
    }
}

假设我有int gender = 1。在这种情况下,1 是Gender.female 的值。

我想使用gender 变量来获取array 返回的array 中的Gender.female 枚举的索引。

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

我该怎么做?

【问题讨论】:

  • 你试过编译这段代码了吗?由于Arrays.sort(),我不确定它是否可以编译:values() 数组通常不可修改
  • 我的代码可以完美运行和编译。
  • 好吧,这很奇怪...我猜.values() 会复制一份。
  • Suggestionyour now deleted question。顺便说一句,不要仅仅因为有人反对就删除问题。
  • 另外,如果它解决了您的问题并且您正在使用它,您为什么不接受 fge 答案?

标签: java android


【解决方案1】:

如果你有一个整数是这个枚举的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 令人困惑。

【讨论】:

  • 感谢您的回答。我将我的 int 命名为 gender 以澄清我正在尝试做的事情。
  • 如果它用于索引,那么你最好依赖ordinal(),因为它存在并且有效;)
  • @fge 不,它不是用于索引。我需要那个价值。这是数据库中的PK。我使用该枚举来获得一个 pk 和该 pk 的本地化描述。
  • 那就叫它primaryKey,而不是gender ;)
【解决方案2】:

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

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

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

【讨论】:

  • 如果我删除成员字段性别。我必须使用什么来存储值 0、1、...?
  • stackoverflow.com/a/5021384/44089 枚举本身已经通过它的 ordinal() 方法拥有这个。如果枚举中的元素可能随时间变化(即,如果您有一个定义汽车品牌等的枚举),您只需要像上面那样存储自己的索引。但是对于性别枚举,我真的无法想象。 :)
  • 根据我的经验,依赖 ordinal() 是一种不好的做法。想象一个开发人员在其他成员之前或中间添加一个枚举元素。在许多情况下,显式分配标识符字段是一种很好的做法(例如,在数据库中存储表示实体枚举的值时)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-02
  • 2021-07-25
  • 2012-12-28
相关资源
最近更新 更多