Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中返回上一个枚举值的方法_Java_Enums - Fatal编程技术网

在Java中返回上一个枚举值的方法

在Java中返回上一个枚举值的方法,java,enums,Java,Enums,我有以下枚举: enum Rank{TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE, TEN, JACK, QUEEN, KING, ACE} 我希望创建两种方法。返回上一个值的函数。例如,如果对四调用该方法,则返回三。另一个返回整数值。例如,两个返回2,杰克、王后和国王返回10,王牌返回11 提前感谢第一个问题可以通过向秩枚举添加方法(如我进一步列出的getValue)来解决。这不是唯一的解决方案——例如,也可以使用静态工厂

我有以下枚举:

enum Rank{TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE, TEN, JACK, QUEEN,
          KING, ACE}
我希望创建两种方法。返回上一个值的函数。例如,如果对四调用该方法,则返回三。另一个返回整数值。例如,两个返回2,杰克、王后和国王返回10,王牌返回11


提前感谢

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

对于第二个问题,您应该介绍接受
int
值的
Rank
enum新构造函数,然后在enum实例声明中使用此构造函数

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

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
enum本身进行任何更改:

public static Rank getPreviousRank(Rank currentRank){
    return Rank.values()[currentRank.ordinal() > 0 ? currentRank.ordinal()  - 1 : 0];
}
例如:

System.out.println(getPreviousRank(Rank.FIVE)); //prints FOUR

您好,有没有在枚举中执行getPrevious方法的方法?顺便说一句,这真的很有帮助。非常感谢。我们当然能做到,我的朋友。参见固定答案=)静态实用程序方法不是解决任何问题的好方法;它们只会增加系统的复杂性,增加测试的难度。将该方法添加到枚举中的解决方案本身是完全正确的。静态实用程序方法是一种绝对的反模式,但可以帮助处理一些无法更改的遗留代码(例如)。这就是我在答案中添加此选项的原因:)