【问题标题】:How to implement certain method for enum type如何为枚举类型实现某些方法
【发布时间】:2015-12-29 19:47:39
【问题描述】:

我是编程和 Java 新手,目前正在学习枚举类型。

我创建了一个枚举类型Card,它将每张卡片的值存储在一副卡片中,例如二 = 2,三 = 3 ... Ace = 11。每张图片卡片的值相同,10 .

我正在尝试实现一个方法getPrevious(),它将返回列表中的前一个枚举值。例如,如果在SIX 上调用该方法,它将返回FIVE,在TWO 上调用时将返回ACE。但是我正在努力想办法做到这一点。

您可以在下面看到我编写的当前代码,任何有关如何实现 getPrevious() 方法的帮助或提示都会非常有帮助。

public class EnumPractice {

    public enum Card {
        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 Card card;

        Card(int value){
        this.value = value;
        }

        public int getValue(){
            return value;
        }

        public String toString(){
            return "The value of this card is: " + value;
        }
    }

    public static void main(String[] args) {
        System.out.println(Card.ACE.getValue());
    }
}

【问题讨论】:

标签: java methods types enums enumeration


【解决方案1】:

您的getPrevious() 方法可能如下所示

public enum Card {
    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;

    Card(int value) {
        this.value = value;
    }

    public int getValue() {
        return value;
    }

    public Card getPrevious() {
        int previous = ordinal() - 1;
        if (previous < 0 ) { // if negative, then we have to go to the last element
            previous += values().length;
        }

        return Card.values()[previous];
    }
}

【讨论】:

  • 非常感谢,这个方法非常有用,因为它考虑到了负索引的可能性。但是,我将如何更改此方法以输出 KING 而不是 "10" ACE 而不是 11
  • @Mickd94 getPrevious 返回 KINGACE,因为它被声明为返回 Card。以后如何使用这些值取决于您。
  • 如果要查看值,可以调用方法getValue()。例如:Card.TWO.getPrevious().getValue()
  • @Pshemo 啊,我现在看到我的 toString 方法正在输出 int 值而不是实际的枚举类型值,在将其注释掉后它现在正在输出正确的值,感谢您指出这一点。
【解决方案2】:

这是你的getPrevious() 实现

import java.util.Arrays;

public class EnumPractice {

    public enum Card {

        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 Card card;

        Card(int value){
        this.value = value;
        }

        public int getValue(){
            return value;
        }

        public String toString(){
            return "The value of this card is: " + value;
        }

        public Card getPrevious() {
            int pos = ordinal();
            if (pos == 0)
                return ACE;
            return values()[pos - 1];
        }
    }

    public static void main(String[] args) {

    System.out.println(Card.THREE.getPrevious());
    System.out.println(Card.TWO.getPrevious());

    }

}

上面的程序输出是

The value of this card is: 2
The value of this card is: 11

【讨论】:

  • 您可能想使用ordinal() 而不是getValue()。如果您不使用private Card card;,还有什么意义?
  • Arrays.binarySearch(this.values(), this) 可以替换为ordinal()
  • 另外values() 是静态方法,所以尽量不要从实例中调用它。像 ACE 这样的枚举值也是如此(我们不需要在它之前使用 this.)。
  • 我稍微更新了您的代码以消除这些问题。希望你不要介意。
【解决方案3】:

其他方法可能是参考以前的卡。您可以在静态块中创建所有卡片后设置它,例如:

public enum Card {
    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 Card previous;

    static{
        //lets set previous element for cards
        //we will iterate starting from TWO so its previous should be:
        Card previous = ACE;//yes ACE
        for (Card card : values()){
            card.previous = previous;
            previous = card; 
        }
    }

    Card(int value){
        this.value = value;
    }

    public int getValue(){
        return value;
    }

    public Card getPrevious(){
        return previous; //<-- simple getter is enough since we took care 
                         //    of setting this value earlier in static 
                         //    initialization block
    }

    public String toString(){
        return "The value of this card is: " + value;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-31
    • 1970-01-01
    • 1970-01-01
    • 2010-09-07
    • 2021-08-28
    • 1970-01-01
    相关资源
    最近更新 更多