第一个问题可以通过在Rank 枚举中添加方法(如我进一步列表中的getValue)来解决。它不是唯一的解决方案——例如,也可以使用静态工厂方法。
对于第二个问题,您应该引入接受int 值的Rank 枚举新构造函数,然后在枚举实例声明中使用此构造函数。
现在让我们将这两个更改与您的原始枚举结合起来:
enum Rank {
TWO(2), THREE(3), FOUR(4), FIVE(5), SIX(6), SEVEN(7),
EIGHT(8), NINE(9), TEN(10), JACK(10), QUEEN(10), KING(10), ACE(11);
private int value;
//private constructor which accepts int value for each card.
//It means that ACE(11) call creates ACE instance which holds value of 11 inside
Rank(int i) {
value = i;
}
public int getValue() {
return value;
}
public Rank getPrevRank(){
return values()[ordinal() > 0 ? ordinal() - 1 : 0];
}
}
现在你可以写了:
System.out.println(Rank.FIVE.getPrevRank());//prints FOUR
System.out.println(Rank.ACE.getValue());//prints 11
System.out.println(Rank.FIVE.getPrevRank().getValue());//prints 4
PS:对于您的第一个问题,您也可以使用此 util 方法,而无需对 Rank 枚举本身进行任何更改:
public static Rank getPreviousRank(Rank currentRank){
return Rank.values()[currentRank.ordinal() > 0 ? currentRank.ordinal() - 1 : 0];
}
例子:
System.out.println(getPreviousRank(Rank.FIVE)); //prints FOUR