【发布时间】:2015-02-14 08:53:34
【问题描述】:
好的,所以我目前正在为我正在进行的项目编写一些代码,我决定使用 Enum 进行数据存储是我最好的选择。但是在我生命中的第一次, enum.ordinal() 返回 -1?
代码如下:
DuelRules.Rules rule = DuelRules.Rules.values()[(buttonId - (buttonId < 29 ? 18 : 19))];
if (buttonId == 29) {
rule = DuelRules.Rules.POCKET;
}
System.out.println(rule + ", " + rule.ordinal());
rules.swapRule(player, other, rule);
reset(false);
这里声明:
System.out.println(rule + ", " + rule.ordinal());
它打印了正确的规则值,但是当它打印 rule.ordinal() 时它打印的是 -1?
例子:
HAT, -1
我的枚举:
public enum Rules {
HAT(5000, 1),
CAPE(5000, 2),
AMULET(5000, 4),
WEAPON(5000, 8),
BODY(5000, 16),
SHIELD(5000, 32),
LEG(5000, 128),
GLOVE(5000, 512),
BOOT(5000, 1024),
RING(5000, 4096),
ARROW(5000, 8192),
POCKET(17837, 1),
FORFEIT(4989),
MOVEMENT(4990),
RANGE(4991),
MELEE(4992),
MAGIC(4993),
DRINKS(4994),
FOOD(4995),
PRAYER(4996),
OBSTACLES(4997),
FUN_WEAPONS(4998),
NO_ABILITIES(4999),
SUMMONING(5001);
private final int varbitId;
private final int value;
private Rules(int id, int... value) {
this.varbitId = id;
this.value = value.length > 0 ? value[0] : 0;
}
}
请注意,该枚举在另一个类中,不确定这是否会影响结果。感谢您的帮助,我完全迷失了这个。
编辑:经过进一步审查,我发现通过将其作为参数传递来更改序数?
控制台截图:
代码:
} else if (buttonId >= 18 && buttonId <= 42) {
DuelRules.Rules rule = DuelRules.Rules.values()[(buttonId - (buttonId < 29 ? 18 : 19))];
System.out.println("Point one: "+rule + ", " + rule.ordinal());
rules.swapRule(player, other, rule);
getDuel(other).rules.setRules(player, other, rules
.rules);
reset(false);
sendFlash(interfaceId, buttonId);
}
在打印第一个点的地方,规则及其 .ordinal 是正确的,在本例中为 OBSTACLES,20
但是它在 rules.swapRule 中传递规则参数的地方,它会将序数更改为 -1?
public boolean swapRule(Player player, Player other, Rules rule) {
System.out.println("Point 2(swapRule): " + rule + ", " + rule.ordinal());
}
是什么导致规则参数在作为参数传递时发生变化?
【问题讨论】:
-
大多数程序员都不会使用这种方法。它设计用于复杂的基于枚举的数据结构,例如 EnumSet 和 EnumMap(来自javadoc)。当您需要使用元素索引时使用枚举是一种不好的做法。
-
我无法重现这个。请发布一个完整且可重现的示例。
-
我投票结束。您所描述的内容与
Enum#ordinal()的 javadoc 相违背,您仍然没有提供证据。 -
将行更改为
System.out.println("This is an experiment: " + rule + ", " + rule.ordinal());然后发布输出的屏幕截图 这是一个实验:HAT,-1。最合乎逻辑的解释是输出 HAT, -1 实际上是由代码中的不同行生成的。 -
我知道你可能不再关心了,因为问题已经消失了。但我对此很着迷。这是我见过的最奇怪的问题。是否可以将整个班级的 DuelRules 发布?