我想有一个模拟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;
}
}
Run Code Online (Sandbox Code Playgroud)
除了我想在所有枚举中创建一个通用的版本.现在,由于.values()和.ordinal()方法是由编译器隐式添加的,似乎访问它们的唯一方法是使用反射,这会耗尽我试图通过避免获得的性能增益自动拳击,但也许有一些我想念的东西.
有什么想法吗?
编辑:
我认为我最初的问题不清楚.我想要一个类(作为通用参数)枚举,然后可以使用相同的操作.
因此,我可以将它与任何类型的枚举一起使用,而无需每次都为每种枚举编写类.如:
enum Attribute { Height, Weight }
enum AbilityScore {Str, Dex, Con, Int, Wis, Cha}
IdealClass<Attribute> attributeVersion;
IdealClass<AbilityScore> abilityScoreVersion;
Run Code Online (Sandbox Code Playgroud)
等等.
这是一个解决方案:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
您还必须使用枚举类初始化地图.
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);
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
3554 次 |
最近记录: |