ordinal()
方法返回枚举实例的序号。
如何设置枚举的序号?我可以在Java中为枚举指定序号吗?
回答
你不能设置它。它始终是不变定义的序数。看到documentation for Enum.ordinal():
返回枚举常数的序(它在枚举声明,其中初始常量被分配的零序位置)。大多数程序员将无法使用这种方法。它设计用于复杂的基于枚举的数据结构,如EnumSet和EnumMap。
实际上 - 你不应该需要。如果你想要一些整数属性,请定义一个。
您可以通过更改枚举的顺序来控制序号,但不能像C++
那样显式设置它。一个解决办法是你想要的号码提供额外的方法,在您的枚举:
enum Foo {
BAR(3),
BAZ(5);
private final int val;
private Foo(int v) { val = v; }
public int getVal() { return val; }
}
在这种情况下BAR.ordinal() == 0
,但BAR.getVal() == 3
。
从http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Enum.html
公共最终诠释序()返回此枚举常数的序(它在枚举声明,其中初始常量被分配的零序位置)。大多数程序员将无法使用这种方法。它设计用于复杂的基于枚举的数据结构,如EnumSet和EnumMap。
返回: 枚举常量的序
如果你有
公共枚举日{ 周日,周一,周二,周三, 周四,周五,周六 }
然后SUNDAY的序数为0,MONDAY为1,依此类推...
检查出的Java Enum examples和docs
返回枚举常数的序(它在枚举声明,其中初始常量被分配的零序位置)。大多数程序员将无法使用这种方法。它设计用于复杂的基于枚举的数据结构,如EnumSet和EnumMap。
简单的答案:只是改变常量的顺序。第一个定义为0,第二个定义为1,等等。但是,如果你经常更改代码,或者枚举会有许多值,这可能不太实际。您可以定义一个自定义方法来解决默认序号问题,但请确保它有充分的文档记录以避免混淆!
public enum Values
{
ONE, TWO, THREE, FOUR;
public int getCustomOrdinal()
{
if(this == ONE)
{
return 3;
}
else if(this == TWO)
{
return 0;
}
...
}
}
+1:switch语句可能比一系列if-else语句更好。 – 2011-03-21 07:44:00
我不喜欢这个解决方案。枚举是类,因此可以包含自定义属性。我宁愿为这个和相应的getter方法定义一个字段。 – Atmocreations 2014-05-21 09:04:04
这是一般较好的解决方案。但问题是否有可能改变ordinal()的行为... – donnyton 2014-09-05 20:46:58
您可以使用反射更新序号:
private void setEnumOrdinal(Enum object, int ordinal) {
Field field;
try {
field = object.getClass().getSuperclass().getDeclaredField("ordinal");
field.setAccessible(true);
field.set(object, ordinal);
} catch (Exception ex) {
throw new RuntimeException("Can't update enum ordinal: " + ex);
}
}
由于接受的答案指出,你不能设置序号。你可以得到这个最接近的是自定义属性:
public enum MonthEnum {
JANUARY(1),
FEBRUARY(2),
MARCH(3),
APRIL(4),
MAY(5),
JUNE(6),
JULY(7),
AUGUST(8),
SEPTEMBER(9),
OCTOBER(10),
NOVEMBER(11),
DECEMBER(12);
MonthEnum(int monthOfYear) {
this.monthOfYear = monthOfYear;
}
private int monthOfYear;
public int asMonthOfYear() {
return monthOfYear;
}
}
- 1. 我可以在枚举中声明枚举以指定/限制Java中的映射中的键和值吗?
- 2. 我可以在Java中设置枚举启动值吗?
- 3. 我可以比较MySQL枚举吗?
- 4. MySQL:我可以共享枚举吗?
- 5. 我可以使用参数枚举吗?
- 6. 我可以用位或对Java枚举
- 7. 我们可以在函数内部定义枚举吗?
- 8. 我怎么可以参考我的Java枚举没有指定其类型
- 9. 我可以迭代多维枚举(java)吗?
- 10. 是否可以在C++ 11中指定枚举的位宽?
- 11. 我可以配置ServiceStack.Text以将枚举值序列化为camelCase吗?
- 12. .NET 3.5中有可能指定一个枚举类型吗?
- 13. 我可以使用枚举作为ConverterParameter吗?
- 14. Java:我可以使用常量字符串作为枚举键值吗?
- 15. Java在枚举中的枚举
- 16. 我可以在css中指定maxlength吗?
- 17. 我可以typdef一个枚举是另一个typdef枚举的扩展吗?
- 18. JAXB/MOXy可以像常规类(非枚举)一样序列化枚举吗?
- 19. 枚举在Java中
- 20. 在Java中,为什么可以用另一个枚举常量限定枚举常量?
- 21. 我可以在枚举上使用Spring的@Component吗?
- 22. 在Prolog中枚举序列号
- 23. 在枚举java
- 24. 为什么枚举包括可枚举
- 25. 排序可枚举
- 26. 将java枚举转换为scala枚举json4s序列化
- 27. 枚举在Hibernate中,坚持为枚举
- 28. Java枚举找到枚举
- 29. Java类枚举枚举类
- 30. Java枚举可以添加一个返回方法吗?
如果我可以指定枚举的顺序,当使用JPA用枚举,那将是更安全... – 2011-03-21 14:18:41