Próbuję znaleźć odpowiednik Java dla następnego wygody w C++:C-jak enum w Javie
enum {
ANIMAL_CAT = 0,
ANIMAL_RAT,
ANIMAL_BAT, ...
NUM_ANIMALS
};
Animal animals[NUM_ANIMALS];
animals[ANIMAL_CAT].mNumLegs = 4;
animals[ANIMAL_RAT].mNumLegs = 4; ...
wiem, że to nie jest najfajniejsza rzecz na świecie, ale mogę dodać nowy ANIMAL_xxx w dowolnym miejscu w enum i wszystkie poniższe wpisy zostaną automatycznie dostosowane. Czy jest to czysty sposób na to w Javie?
Dzięki za odpowiedzi, ale mógłbym nawiązywać do większej prostoty, niż zamierzałem.
Pracuję nad grą, w której jest fizyka, silnik sztucznej inteligencji itp. Próbuję skonsolidować wszystkie informacje potrzebne dla każdego rodzaju jednostki (niektóre mają tylko fizyczną manifestację, podczas gdy niektóre mają zarówno phys i AI, etc ...), dzięki czemu mogę łatwo dodawać/modyfikować typy (tak, zwierzę jest złym przykładem, ponieważ potrzebuję kamieni, roślin itp.).
Używam klasy do przechowywania informacji o typie, podczas gdy inne klasy polegają na tej klasie, aby wyszukać atrybuty (wymiary, indeks bitmapowy, hasAi itd.). W końcu próbuję oczyścić coś podobnego do następującego, pozwalając jednocześnie mi łatwo dodawać nowe typy:
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[];
}
teraz wydaje się to jak jakiś implementacji XML może być „prawo” rzeczy do zrobienia, ale nie jestem pewien o tym, jak to zrobić (nowość w Javie). W każdym razie, inne klasy mogą z łatwością po prostu użyć unitTypeInfo.mTypes [UnitTypeInfo.TYPE_CAT] .mMass (utworzony), aby sprawdzić masę kota. Jednakże, jeśli chcę dodać TYPE_DOG pod definicją TYPE_CAT, muszę zaktualizować wszystko pod nim (leniwy, wiem, ale załóżmy, że jest jeszcze kilka typów).
Obliczenia są łatwym rozwiązaniem tego problemu w C++, ale w Javie, najprostsze rozwiązanie, jakie mogę wykonać teraz, wymaga czegoś takiego jak: unitTypeInfo.mTypes [UnitTypeInfo.mTypeEnum.TYPE_CAT.ordinal()]. mMass - i chociaż przypuszczam, że to nie jest dużo gorzej niż moje już marne rozwiązanie, dodaje trochę więcej pośredniego i rzeczywistego wywołania metody (do metody, której większość źródeł nie zachęca).
Jeszcze jedno jest to, że chcę mieć możliwość wywołania przełącznika (typu), co może również ograniczyć możliwe rozwiązania.
W każdym razie zaczynam rozumieć, że musi być znacznie lepsze rozwiązanie tego problemu. Jakieś sugestie?
http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html –
Podobne pytanie tutaj może pomóc: http://stackoverflow.com/questions/1741708/enum-values-length-vs -prywatne pole – Parappa
Nie ma powodu, aby mieć tablicę wszystkich wyliczeń w pierwszej kolejności - wyliczenia java są jedną z jego najlepszych funkcji, które zawsze niestety brakuje w C++/C#, gdzie jest to po prostu syntaktyczny cukier wokół "int". Chociaż w tym konkretnym przypadku nie użyłbym enum na początek, ale klasa - wydaje się lepszą architekturą (choć może to zależeć od dokładnego użycia itd.) – Voo