Sto cercando di trovare un equivalente Java per la seguente convenienza in C++:C-like enum in 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; ...
So che questa non è la cosa più bella del mondo, ma posso aggiungere una nuovo ANIMAL_xxx in qualsiasi punto dell'enum e tutte le voci seguenti verranno regolate automaticamente. C'è un modo pulito per farlo in Java?
Grazie per le risposte, ma potrei aver accennato a una semplicità maggiore di quanto intendessi.
Sto lavorando a un gioco, dove c'è una fisica, un motore di intelligenza artificiale, ecc. Sto cercando di consolidare tutte le informazioni di cui ho bisogno per ogni tipo di entità (alcuni hanno solo una manifestazione fisica, mentre alcuni hanno entrambi fisica e intelligenza artificiale, ecc.), in modo che io possa facilmente aggiungere/modificare i tipi (quindi, l'animale è un cattivo esempio, perché potrei aver bisogno di rocce, piante, ecc ...).
Sto usando una classe per memorizzare le informazioni sul tipo, mentre altre classi si basano su quella classe per cercare gli attributi (dimensioni, indice bitmap, hasAi, ecc ...) Alla fine, sto provando a pulire qualcosa di simile alla seguente, mentre che mi permette di aggiungere facilmente nuovi tipi:
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[];
}
Ora, questo sembra come una sorta di implementazione XML potrebbe essere la cosa 'giusta' da fare, ma non sono sicuro su come farlo (nuovo in Java). In ogni caso, le altre classi possono facilmente usare unitTypeInfo.mTypes [UnitTypeInfo.TYPE_CAT] .mMass (istanziato) per cercare la massa del gatto. Tuttavia, se voglio aggiungere un TYPE_DOG sotto la definizione TYPE_CAT, devo aggiornare tutto sotto (pigro, lo so, ma immaginiamo che ci siano altri tipi.)
Enums offrono una soluzione facile a questo problema in C++, ma in Java, la soluzione più semplice con cui posso fare ora richiede qualcosa come: unitTypeInfo.mTypes [UnitTypeInfo.mTypeEnum.TYPE_CAT.ordinal()]. mMass - e anche se suppongo che questo non sia molto più la mia soluzione già scadente, aggiunge un po 'più di indirezione e una chiamata al metodo reale (a un metodo che la maggior parte delle fonti non sembra incoraggiare).
Un'altra cosa è che voglio essere in grado di chiamare uno switch (tipo), in modo da limitare anche le possibili soluzioni.
In ogni caso, sto iniziando a pensare che ci sia una soluzione molto migliore a questo problema. Eventuali suggerimenti?
http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html –
La domanda correlata qui potrebbe aiutare: http://stackoverflow.com/questions/1741708/enum-values-length-vs -privato-campo – Parappa
Nessun motivo per avere una matrice di tutte le enumerazioni in primo luogo - le enumerazioni di java sono una delle sue migliori caratteristiche che mi manca sempre in C++/C# dove è il suo giusto zucchero sintattico attorno a un "int". Anche se in questo caso particolare non userei un enum per cominciare, ma una classe - mi sembra l'architettura migliore (anche se potrebbe dipendere dall'uso esatto e così via ..) – Voo