estoy tratando de encontrar un equivalente Java para el siguiente conveniencia en C++:enumeración C-como en 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; ...
Sé que esto no es la cosa más bonita del mundo, pero puede agregar una nuevo ANIMAL_xxx en cualquier lugar de la enumeración y todas las siguientes entradas se ajustarán automáticamente. ¿Hay una manera limpia de hacer esto en Java?
Gracias por las respuestas, pero puedo haber aludido a una mayor simplicidad de la que pretendía.
Estoy trabajando en un juego, donde hay una física, un motor de IA, etc. Estoy tratando de consolidar toda la información que necesito para cada tipo de entidad (algunos tienen solo una manifestación física, mientras que otros tienen ambos phys y AI, etc ...), de modo que puedo agregar/modificar fácilmente tipos (entonces, animal es un mal ejemplo, porque puedo necesitar rocas, plantas, etc.).
Estoy usando una clase para almacenar la información de tipo, mientras que otras clases dependen de esa clase para buscar los atributos (dimensiones, índice de mapa de bits, hasAi, etc.) Al final, estoy tratando de limpiar algo similar a lo siguiente, mientras que lo que me permite añadir fácilmente nuevos tipos:
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[];
}
Ahora, esto parece como una especie de aplicación XML podría ser la cosa 'correcta' de hacer, pero no estoy seguro acerca de cómo hacer eso (nuevo en Java). De todos modos, las otras clases pueden simplemente usar unitTypeInfo.mTypes [UnitTypeInfo.TYPE_CAT] .mMass (instanciado) para buscar la masa del gato. Sin embargo, si quiero agregar un TYPE_DOG debajo de la definición TYPE_CAT, tengo que actualizar todo debajo (perezoso, lo sé, pero imaginemos que hay algunos tipos más).
Los enum ofrecen una solución fácil a este problema en C++, pero en Java, la solución más simple que puedo hacer ahora requiere algo como: unitTypeInfo.mTypes [UnitTypeInfo.mTypeEnum.TYPE_CAT.ordinal()]. mMass - y aunque supongo que esto no es mucho peor que Mi ya de por sí mala solución, agrega un poco más de indirección y una llamada al método real (a un método que la mayoría de las fuentes no parecen alentar).
Una cosa más es que quiero poder llamar a un interruptor (tipo), por lo que también podría limitar las posibles soluciones.
De todos modos, estoy empezando a tener la idea de que debe haber una solución mucho mejor para todo este problema. ¿Alguna sugerencia?
http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html –
La pregunta relacionada aquí podría ayudar: http://stackoverflow.com/questions/1741708/enum-values-length-vs -private-field – Parappa
No hay razón para tener una matriz de todas las enumeraciones en primer lugar - las enumeraciones de Java son una de sus mejores características que siempre echo de menos en C++/C# donde su azúcar sintáctico solo está alrededor de un "int". Aunque en este caso particular no usaría una enumeración para empezar, sino una clase, parece que la mejor arquitectura (aunque eso puede depender del uso exacto, etc.) – Voo