【发布时间】:2012-03-26 00:14:50
【问题描述】:
Java 声明初始值的序数是 0。我可以假设当我创建这样的枚举时:
public enum Direction {MONDAY, TUESDAY, WEDNESDAY, THURSDAY, ...}
TUESDAY 的序数总是 1,WEDNESDAY 的序数总是 2,...?
我会更具体一点。我声明一个枚举:
public enum Direction {UP,RIGHT,DOWN,LEFT}
现在有一种方法可以旋转 90 度(顺时针)。它是带序数的一行:
direction = Direction.values()[direction.ordinal()+1 % Direction.values().length];
如果我不使用序数,我将不得不使用 switch 语句或条件:
switch (direction) {
case LEFT:newdirection = Direction.UP;
break;
etc...
}
使用序数有几个好处:
- 更短的代码
- 更快的代码(可以忽略不计)
- 如果添加了一个方向(例如
DOWN_LEFT),只要将新方向放在正确的位置,实现就不必改变
你怎么看?
【问题讨论】:
-
如果它很重要(例如,对于自定义序列化),无论如何你最好使用显式映射。只需创建一个
EnumMap<Direction, Integer>或给Direction一个int字段。 -
我宁愿保持干净。这是给学校的,但从技术上讲,我们还没有使用枚举,而且 EnumMap 可能有点极端,因为我们甚至还没有了解数组:D。
-
您的清洁概念有点误导:-)。依赖序数将是一种非常混乱的编码方式。
-
我不明白你为什么不依赖比较枚举本身。你到底在用这个做什么?
-
我的干净概念是“短而清晰”。在每种情况下都有多个条件的 switch 语句不如 2 行代码那么干净。代码更难理解,但更干净。因此,如果您在房间里扔一堆东西,那会很乱。如果你只往里面扔两件小东西,它还是很干净的。
标签: java enumeration ordinal