Is there a builtin way to get the number of items of an Enum with something like Myenum.length
,
Or do I have to implement myself a function int size()
hardcording the number of element?
Is there a builtin way to get the number of items of an Enum with something like Myenum.length
,
Or do I have to implement myself a function int size()
hardcording the number of element?
Yes you can use the Enum.values()
method to get an array of Enum values then use the length
property.
public class Main {
enum WORKDAYS { Monday, Tuesday, Wednesday, Thursday, Friday; }
public static void main(String[] args) {
System.out.println(WORKDAYS.values().length);
// prints 5
}
}
You can get the length by using Myenum.values().length
The Enum.values()
returns an array of all the enum
constants. You can use the length
variable of this array to get the number of enum
constants.
Assuming you have the following enum:
public enum Color
{
BLACK,WHITE,BLUE,GREEN,RED
}
The following statement will assign 5 to size
:
int size = Color.values().length;
To avoid calling values() method each time:
public class EnumTest {
enum WORKDAYS {
Monday,
Tuesday,
Wednesday,
Thursday,
Friday;
public static final int size;
static {
size = values().length;
}
}
public static void main(String[] args) {
System.out.println(WORKDAYS.size); // 5
}
}
The enum.values() method is added by the Java complier and is not mentioned in the APIs.
MyEnum.values()
returns the enum constants as an array.
So you can use:
int size = MyEnum.values().length
I searched for a Kotlin answer and this question popped up. So, here is my answer.
enum class MyEnum { RED, GREEN, BLUE }
MyEnum.values().size // 3
This is another way to do it:
inline fun <reified T : Enum<T>> sizeOf() = enumValues<T>().size
sizeOf<MyEnum>() // 3
Thanks to Miha_x64 for this answer.
In reply to the answer of Yevhen Tkachenko it can be further optimized when using the enum values array, so the compiler calls values()
only once:
public class EnumTest {
enum WORKDAYS {
Monday,
Tuesday,
Wednesday,
Thursday,
Friday;
public static final WORKDAYS[] values = WORKDAYS.values();
}
public static void main(String[] args) {
System.out.println(WORKDAYS.values.length); // 5
for (int i = 0; i < WORKDAYS.values.length; i++)
System.out.println(WORKDAYS.values[i].name());
}
}