我正在尝试为C++中的以下便利找到等效的Java:

enum {
  ANIMAL_CAT = 0,
  ANIMAL_RAT,
  ANIMAL_BAT, ...
  NUM_ANIMALS
};

Animal animals[NUM_ANIMALS];

animals[ANIMAL_CAT].mNumLegs = 4;
animals[ANIMAL_RAT].mNumLegs = 4; ...

我知道这不是世界上最漂亮的东西,但是我可以在枚举的任意位置添加一个新的ANIMAL_xxx,并且以下所有条目都会自动进行调整。在Java中有没有一种干净的方法可以做到这一点?

感谢您的答复,但我可能暗示比我预期的要简单得多。

我正在开发一款具有物理,AI引擎等功能的游戏。我正在尝试整合每种实体所需的所有信息(有些实体只有一种物理表现,而有些实体同时具有实体和AI,等),这样我就可以轻松地添加/修改类型(因此,动物是一个不好的例子,因为我可能需要岩石,植物等)。

我正在使用一个类来存储类型信息,而其他类则依赖该类来查找属性(尺寸,位图索引,hasAi等)。最后,我试图清除类似的内容以下内容,同时允许我轻松添加新类型:
class UnitTypeInfo {
  UnitTypeInfo() {
    mTypes = new TypeInfo[NUM_TYPES];

    // and allocate...

    // initialize TypeInfos here
    mTypes[TYPE_CAT].mType = TYPE_CAT;
    mTypes[TYPE_CAT].mMass = 10.0f;
    mTypes[TYPE_CAT] ...

    mTypes[TYPE_ROCK].mType = TYPE_ROCK;
    ...
  }

  public class TypeInfo {
    public int mType;
    public int mRawResourceHandle;
    public float mMass;
    public Vector2d mDimensions;
    public float mHealth;
    public boolean mHasAi;
    ...
  }

  public static final int TYPE_CAT = 0;
  public static final int TYPE_ROCK = 1;
  public static final int TYPE_TREE = 2; ...
  public static final int NUM_TYPES = ???; // the last TYPE_ + 1

  public TypeInfo mTypes[];
}

现在,似乎某种XML实现可能是“正确的”事情,但是我不确定如何做到这一点(对Java来说是新的)。无论如何,其他类可以轻松地使用unitTypeInfo.mTypes [UnitTypeInfo.TYPE_CAT] .mMass(已实例化)来查找猫的体重。但是,如果我想在TYPE_CAT定义下添加TYPE_DOG,则必须更新其下的所有内容(我知道这很懒,但是让我们看一下还有更多类型。)

枚举为C++中的这个问题提供了一个简单的解决方案,但是在Java中,我现在可以使用的最简单的解决方案需要类似以下内容:unitTypeInfo.mTypes [UnitTypeInfo.mTypeEnum.TYPE_CAT.ordinal()]。mMass-虽然我认为是这样并没有比我已经很糟糕的解决方案差多少,它确实增加了更多的间接调用和实际的方法调用(对于大多数资源似乎都不鼓励的方法)。

还有一件事是,我希望能够调用switch(type),这样也可能会限制可能的解决方案。

无论如何,我开始意识到必须有一个更好的解决方案来解决整个问题。有什么建议么?

最佳答案

“经典” java始终使用“静态最终int ANIMAL_CAT = 0;”。在这种情况下。

JDK 1.5引入了“类型安全的枚举”:

http://www.javapractices.com/topic/TopicAction.do?Id=1

您现在可以执行此操作(一种非常常见的做法):

enum Quark {
    /*
    * These are called "enum constants".
    * An enum type has no instances other than those defined by its
    * enum constants. They are implicitly "public static final".
    * Each enum constant corresponds to a call to a constructor.
    * When no args follow an enum constant, then the no-argument constructor
    * is used to create the corresponding object.
    */
    UP,
    DOWN,
    CHARM,
    STRANGE,
    BOTTOM,
    TOP
  }

或者,您可以执行以下操作:
/**
  * Example 2 - adding a constructor to an enum.
  *
  * If no constructor is added, then the usual default constructor
  * is created by the system, and declarations of the
  * enum constants will correspond to calling this default constructor.
  */
  public enum Lepton {
    //each constant implicity calls a constructor :
    ELECTRON(-1, 1.0E-31),
    NEUTRINO(0, 0.0);

    /*
    * This constructor is private.
    * Legal to declare a non-private constructor, but not legal
    * to use such a constructor outside the enum.
    * Can never use "new" with any enum, even inside the enum
    * class itself.
    */
    private Lepton(int aCharge, double aMass){
      //cannot call super ctor here
      //calls to "this" ctors allowed
      fCharge = aCharge;
      fMass = aMass;
    }
    final int getCharge() {
      return fCharge;
    }
    final double getMass() {
      return fMass;
    }
    private final int fCharge;
    private final double fMass;
  }

这是官方文档:

http://docs.oracle.com/javase/1.5.0/docs/guide/language/enums.html

09-11 18:01