我希望有一个类来模拟EnumMap,但是存储int值而不是某种对象。很明显,您可以创建一个映射到整数的EnumMap,但如果可能的话,这是很多自动装箱操作,我想避免。
所以我想上这样的课:
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()方法是由编译器隐式添加的,因此访问它们的唯一方法似乎是使用反射,这将通过避免自动装箱而耗尽我想要获得的性能增益,但也许我缺少了一些东西。
有什么想法吗?
编辑:
我想我最初的问题还不清楚。我希望一个类接受(作为泛型参数)枚举,然后可以使用相同的操作。
所以我可以在任何类型的枚举中使用它,而不需要每次都为每种枚举编写类。例如:
enum Attribute { Height, Weight }
enum AbilityScore {Str, Dex, Con, Int, Wis, Cha}
IdealClass<Attribute> attributeVersion;
IdealClass<AbilityScore> abilityScoreVersion;诸若此类。
发布于 2013-04-25 07:31:53
这是一个解决办法:
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;
}
}您还必须使用枚举的类初始化映射。
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);发布于 2013-04-25 07:42:22
要从基因上做到这一点,关键在于了解枚举的通用绑定:
<T extends Enum<T>>您的班级可以为任何一个枚举工作如下:
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的运行时类型擦除而需要的。
发布于 2013-04-25 07:29:32
所有java Enum都隐式扩展了java.lang.Enum,因此我认为您需要的是:
public class EnumIntAttributeMap<E extends java.lang.Enum<E>> {
// [...]
}https://stackoverflow.com/questions/16208434
复制相似问题