我正在尝试使用Enum创建层次结构类型系统。我以前从未使用过Enum。
此方法始终返回Peasant。我认为这是因为我错误地使用了“this”,或者说我完全误解了枚举词。
public enum Rank {
PEASANT,
TRADER,
SQUIRE,
MERCHANT,
KNIGHT,
NOBLE,
KING;
public Rank getNextRank() {
switch (this) {
case PEASANT:
return SQUIRE;
case SQUIRE:
return KNIGHT;
case KNIGHT:
return NOBLE;
case NOBLE:
return KING;
case KING:
return PEASANT;
}
return PEASANT;
}
}
(我知道KING案例不是必需的,但我喜欢它的可读性)
我希望Rank.PEASANT.getNextRank()
返回Rank.SQUIRE
和Rank.NOBLE.getNextRank()
返回Rank.KING
等。
答案 0 :(得分:2)
那么代码应该工作,但我个人只是使用ordinal()
:
public Rank getNextRank() {
Rank[] allRanks = Rank.values();
return allRanks[(ordinal() + 1) % allRanks.length];
}
如果在枚举中使用静态最终字段(在静态初始化程序块中设置为Rank.values()
),则可以避免调用Rank.values()
(在每次调用时创建一个新数组)。
如果您可以将“下一个等级”传递给枚举构造函数并将其存储为字段,那将是很好的,但是在这种情况下这不起作用,因为您每次都有效地使用前向引用。您可能有一个非最终字段,并在静态初始化程序中设置值,当然:
public enum Rank {
PEASANT,
TRADER,
SQUIRE,
MERCHANT,
KNIGHT,
NOBLE,
KING,
private Rank next;
static {
PEASANT.next = TRADER;
TRADER.next = SQUIRE;
SQUIRE.next = MERCHANT;
MERCHANT.next = KNIGHT;
NOBLE.next = KING;
KING.next = PEASANT;
}
public Rank getNextRank() {
return next;
}
}
这会更灵活,例如,如果你想要两个“相等”的等级,它们都具有相同的“下一个”等级。
答案 1 :(得分:1)
我无法在评论中表达其工作正常。请参阅图片。
再次检查流程。问题在于其他地方。
System.out.println(Rank.SQUIRE.getNextRank()); //printed KNIGHT