Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 是否访问任意枚举的.values()和.ordinal()方法?_Java - Fatal编程技术网

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

Java 是否访问任意枚举的.values()和.ordinal()方法?,java,Java,我希望有一个模拟EnumMap的类,但是存储int值而不是某种对象。很明显,你可以制作一个映射到整数的枚举映射,但是如果可能的话,我想避免很多自动装箱 我想上这样的课: public class EnumIntAttributeMap { enum Attribute { Height, Weight; } private final int[] values; public EnumIntAttributeMap() {

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

我想上这样的课:

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;
    }
}
public enum MyEnum implements IValueEnum<Integer> {
   WIDTH(1),
   HEIGHT(2);

   private final int value;
   MyEnum(int value) { this.value = value; }

   @Override
   public Integer value() {
      return value;
   }
}
除了我想做一个在所有枚举中通用的版本。现在,由于.values()和.ordinal()方法是由编译器隐式添加的,因此访问它们的唯一方法似乎是使用反射,这将消耗我试图通过避免自动装箱获得的性能收益,但可能我缺少了一些东西

有什么想法吗

编辑:

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

因此,我可以将它用于任何类型的枚举,而无需每次为每种枚举编写类。例如:

enum Attribute { Height, Weight }

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

IdealClass<Attribute> attributeVersion;

IdealClass<AbilityScore> abilityScoreVersion;
enum属性{Height,Weight}
枚举能力核心{Str,Dex,Con,Int,Wis,Cha}
理想类属性外翻;
理想班级能力核心化;
等等。

阅读以下内容:

我认为你可以做一些类似于行星的事情:

public enum YourEnum{
    HEIGHT (0),
    WIDTH  (1);

    private final int index;

    YourEnum(int index) {
        this.index = index;
    }
    public int index() { return index; }
}

这是我个人使用的,并在API中提供了很好的标准化

通用接口:

public interface IValueEnum<T> {       
   T value();
}
公共接口IValueEnum{
T值();
}
枚举按如下方式实现:

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;
    }
}
public enum MyEnum implements IValueEnum<Integer> {
   WIDTH(1),
   HEIGHT(2);

   private final int value;
   MyEnum(int value) { this.value = value; }

   @Override
   public Integer value() {
      return value;
   }
}
public enum MyEnum实现了IValueEnum{
宽度(1),
身高(2);
私有最终整数值;
MyEnum(int值){this.value=value;}
@凌驾
公共整数值(){
返回值;
}
}
现在,您可以通过MyEnum.WIDTH.value()等方式获得最终值。因为它使用泛型,所以其他枚举可以使用long或string,或者您使用的其他类型。它允许您在应用程序中有一个简单的基于枚举的接口。它还允许您在地图中完全通用,等等

编辑:基于新示例

public class IdealClass<T extends Enum> {

  T enumValue;

  public IdealClass() {
  }

}
公共类IdealClass{
T值;
公共思想类(){
}
}

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

public class EnumIntAttributeMap<E extends java.lang.Enum<E>> {
    // [...]
}
公共类枚举属性映射{
// [...]
}
这是一个解决方案:

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;
    }
}
公共类EnumIntMap{
私有最终int[]值;
公共EnumIntMap(类cls)
{
this.values=newint[cls.getEnumConstants().length];
}
公共整数getValue(EA)
{
返回此.values[a.ordinal()];
}
公共无效设置值(EA,int值)
{
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);
enum属性{Height,Weight}
枚举能力核心{Str,Dex,Con,Int,Wis,Cha}
EnumIntMap attributeVersion=新的EnumIntMap(Attribute.class);
EnumIntMap abilityScoreVersion=新的EnumIntMap(AbilityScore.class);

从基因上做到这一点的关键是了解枚举的泛型界限:

<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;
    }
}
公共类枚举属性映射{
私有最终int[]值;
私人期末班;
公共枚举属性映射(类clazz){
this.clazz=clazz;
this.values=newint[clazz.getEnumConstants().length];
}
公共整数getValue(TA){
返回此.values[a.ordinal()];
}
公共无效设置值(TA,int值){
this.values[a.ordinal()]=value;
}
}

请注意,构造函数需要一个类型标记,这是由于java的运行时类型擦除所必需的。

我已经在使用枚举的序号作为索引,我只希望能够对同一类的多个枚举执行此操作。@lokator或者使用此方法,您可以向名为getIndex()的接口添加一个方法,然后您可以使用IValueEnum作为泛型类型。。。不是吗?@Ixx你。。。能够但这实际上与我想要的正好相反。与让您将枚举值映射到整数的可调整映射不同,您只需要得到一组静态最终全局值。但这只会给您一个E,您不能在构造函数中调用.values()来设置数组长度。哦,这就是您的做法。。我一直在尝试getDeclaringClass()和其他一些奇怪的东西,结果我的头撞到了墙上。可爱。Maba你是我今天最喜欢的人。如果你的
int
值很小,即在缓存中,这不会有任何区别(顺便说一句,你可以增加缓存的大小)。但是,如果你的int值很大,它可能会给你带来一些内存/垃圾。我看到你可以用命令行参数扩展整数缓存。在项目从项目内部开始后,是否有办法做到这一点?