首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >访问任意枚举的.values()和.ordinal()方法?

访问任意枚举的.values()和.ordinal()方法?
EN

Stack Overflow用户
提问于 2013-04-25 07:05:56
回答 5查看 3.9K关注 0票数 7

我希望有一个类来模拟EnumMap,但是存储int值而不是某种对象。很明显,您可以创建一个映射到整数的EnumMap,但如果可能的话,这是很多自动装箱操作,我想避免。

所以我想上这样的课:

代码语言:javascript
复制
public class EnumIntAttributeMap
{
    enum Attribute
    {
        Height, Weight;
    }

    private final int[] values;

    public EnumIntAttributeMap()
    {
        this.values = new int[Attribute.values().length];
    }

    public int getValue(Attribute a)
    {
        return this.values[a.ordinal()];
    }

    public void setValue(Attribute a, int value)
    {
        this.values[a.ordinal()] = value;
    }
}

不过,我想做一个跨所有枚举的通用版本。现在,由于.values()和.ordinal()方法是由编译器隐式添加的,因此访问它们的唯一方法似乎是使用反射,这将通过避免自动装箱而耗尽我想要获得的性能增益,但也许我缺少了一些东西。

有什么想法吗?

编辑:

我想我最初的问题还不清楚。我希望一个类接受(作为泛型参数)枚举,然后可以使用相同的操作。

所以我可以在任何类型的枚举中使用它,而不需要每次都为每种枚举编写类。例如:

代码语言:javascript
复制
enum Attribute { Height, Weight }

enum AbilityScore {Str, Dex, Con, Int, Wis, Cha}

IdealClass<Attribute> attributeVersion;

IdealClass<AbilityScore> abilityScoreVersion;

诸若此类。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-04-25 07:31:53

这是一个解决办法:

代码语言:javascript
复制
public class EnumIntMap<E extends Enum<E>> {

    private final int[] values;

    public EnumIntMap(Class<E> cls)
    {
        this.values = new int[cls.getEnumConstants().length];
    }

    public int getValue(E a)
    {
        return this.values[a.ordinal()];
    }

    public void setValue(E a, int value)
    {
        this.values[a.ordinal()] = value;
    }
}

您还必须使用枚举的类初始化映射。

代码语言:javascript
复制
enum Attribute { Height, Weight }

enum AbilityScore {Str, Dex, Con, Int, Wis, Cha}

EnumIntMap<Attribute> attributeVersion = new EnumIntMap(Attribute.class);

EnumIntMap<AbilityScore> abilityScoreVersion = new EnumIntMap(AbilityScore.class);
票数 9
EN

Stack Overflow用户

发布于 2013-04-25 07:42:22

要从基因上做到这一点,关键在于了解枚举的通用绑定:

代码语言:javascript
复制
<T extends Enum<T>>

您的班级可以为任何一个枚举工作如下:

代码语言:javascript
复制
public class EnumIntAttributeMap<T extends Enum<T>> {
    private final int[] values;
    private final Class<T> clazz;

    public EnumIntAttributeMap(Class<T> clazz) {
        this.clazz = clazz;
        this.values = new int[clazz.getEnumConstants().length];
    }

    public int getValue(T a) {
        return this.values[a.ordinal()];
    }

    public void setValue(T a, int value) {
        this.values[a.ordinal()] = value;
    }
}

注意,构造函数需要类型令牌,这是由于java的运行时类型擦除而需要的。

票数 2
EN

Stack Overflow用户

发布于 2013-04-25 07:29:32

所有java Enum都隐式扩展了java.lang.Enum,因此我认为您需要的是:

代码语言:javascript
复制
public class EnumIntAttributeMap<E extends java.lang.Enum<E>> {
    // [...]
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16208434

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档