Perhap this is a simple basic question
Having an enum
public enum TK{
ID,GROUP,DATA,FAIL;
}
Can I get the order number for example ID=0, GROUP=2, DATA=3, FAIL=4 ?
This is a way to to that, but a weird and long one! =S
public enum TK{
ID(0),GROUP(1),DATA(2),FAIL(3);
int num;
TK(int n)
{
this.num=n;
}
public int get()
{
return num;
}
};
to get numbers so I write TK.ID.get(), TK.GROUP.get(), etc... I don't like that
there is a better way?
( C enums, C macros..I miss you both )
thanks
To convert an ordinal into its enum represantation you might want to do this: ReportTypeEnum value = ReportTypeEnum. values()[ordinal];
valueOf() method returns the enum constant of the specified enumtype with the specified name. The name must match exactly an identifier used to declare an enum constant in this type.
The Enum constructor can accept multiple values.
Enum Class in JavaAn enum class can include methods and fields just like regular classes. When we create an enum class, the compiler will create instances (objects) of each enum constants.
The ordinal()
does what you want to do. This is an excerpt from the documentation:
Returns the ordinal of this enumeration constant (its position in its
enum
declaration, where the initial constant is assigned an ordinal of zero). Most programmers will have no use for this method. It is designed for use by sophisticated enum-based data structures, such asEnumSet
andEnumMap
.
Josh Bloch in Effective Java 2nd Edition goes further to explain why using ordinal()
is a terrible idea. Here are some quotes, slightly edited:
Never derive a value associated with an enum from its ordinal; store it in an instance field instead. (Item 31: Use instance fields instead of ordinals) It is rarely appropriate to use ordinals to index arrays: use
EnumMap
instead. The general principle is that application programmers should rarely, if ever, useEnum.ordinal
. (Item 33: UseEnumMap
instead of ordinal indexing)
Your "weird and long" way is precisely the prescription of Item 31.
Fortunately, Java is not C. A Java enum
is very powerful and flexible, supported by many library classes, and you should learn to embrace them instead of using ordinal()
.
Have a look at EnumMap
for example.
A specialized
Map
implementation for use withenum
type keys. All of the keys in anenum
map must come from a singleenum
type that is specified, explicitly or implicitly, when the map is created. Enum Maps are represented internally as arrays. This representation is extremely compact and efficient.
That is, instead of the following (which is perhaps what you wanted to do):
T[] arr = ...;
TK tk = ...;
T something = ...;
arr[tk.ordinal()] = something;
You can instead do:
Map<TK,T> map = new EnumMap<TK,T>(TK.class);
TK tk = ...;
T something = ...;
map.put(tk, something);
The book also covers another "traditional" (ab)use of enum
in C, i.e. bit fields (assigning powers of 2 to each constant etc). Well, for that Java has EnumSet
instead.
Are you looking for ordinal?
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With