在Java中返回先前枚举值的方法

时间:2016-03-22 15:42:07

标签: java enums

我有以下枚举:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<ul id="months">
  <li>January</li>
  <li>February</li>
  <li>March</li>
  <li>April</li>
  <li>May</li>
  <li>June</li>
  <li>July</li>
  <li>August</li>
  <li>September</li>
  <li>October</li>
  <li>November</li>
  <li>December</li>
</ul>

我正在寻找创建两种方法。一个返回前一个值。例如,如果在FOUR上调用该方法,则返回THREE。另一个返回整数值。例如,TWO返回2,JACK,QUEEN和KING返回10,ACE返回11。

提前致谢

1 个答案:

答案 0 :(得分:5)

第一个问题可以通过在getValue枚举中添加方法(如我的进一步列表中的Rank)来解决。它不是唯一的解决方案 - 例如,也可以使用静态工厂方法。

对于第二个问题,您应该向Rank枚举接受int值的新构造函数引入,然后在枚举实例声明中使用此构造函数。

现在让我们将这两个更改与原始枚举结合起来:

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