使用循环枚举枚举实例

5

场景:
我想要一个包含标准牌组中所有扑克牌的枚举。对于这个示例,忽略大小王。

编写:

enum Cards {
    SPADE_1(0, 1),
    SPADE_2(0, 2),
    etc.

感觉不对。

我希望能够做这样的事情

enum Card {
    for (int suit=0; suit<4; suit++) {
        for (int face=1; face<13; face++) {
            new Card(suit, face);
        }
    }
}

我曾考虑将卡片定义为一个包含花色和点数字段的类,其中花色和点数本身是枚举类型。然而,在其他场景中(例如大小王具有红色和黑色两种花色),这样做会导致创建无效的卡片对象(即方块大小王或红桃10)。

自我回答:
显然我没有足够的声望来回答自己的问题。

我不确定是否应该自己回答问题,但@Paul刚才让我想到了一个主意。
声明Card具有私有构造函数,并使用 static Card getCard(suit, face) 方法在返回卡片之前验证组合。

3
也许enum并不是你想要的。你真的需要把三张梅花牌称作CLUBS_3吗? - Paul
是的,绝对可以 - 私有构造函数,分别为SUIT和FACE创建枚举。 - Ernest Friedman-Hill
3个回答

1

我认为使用enum无法完成,但我们可以将class实现为enum。您可以像下面这样做。

实现:

public class Card {
    private int suit;
    private int face;

    private Card(int suit, int face){
        this.suit = suit;
        this.face = face;
    }

    public int getSuit(){
        return this.suit;
    }
    public int getFace(){
        return this.face;
    }
    public static Card[] cards = new Card[52];

      static{
        int counter =0;
        for (int i=0; i<4; i++) {
            for (int j=0; j<13; j++) {
               cards[counter] = new Card(i, j);
               counter++;
            }
        }
      }
}

编辑: 设置卡片的计数器。之前,对于大于15的索引,它会抛出NullPointerException

用法:

System.out.println("face of the card:"+Card.cards[10].getFace());
System.out.println("suit of the card:"+Card.cards[10].getSuit());

输出:

face of the card:7
suit of the card:3

我会使用枚举来表示花色和面值,但我认为公共只读集合结合 get(face, suit) 方法是正确的做法。 - Aaron J Lang
你可以使用枚举或普通类来表示一张卡片,具体实现请参考以下方法:public static Card instance(Rank rank,Suit suit) ... 在 http://stackoverflow.com/questions/8626670/java-enum-or-encoding-with-numbers/8627079#8627079 - Ray Tayek

0
我建议创建两个枚举:一个用于每张牌的花色,另一个用于每张牌的数字。因此,在牌的枚举中,每个枚举都有两个属性:牌的数字(如果您不想使用普通数字,可以再创建一个枚举),以及代表花色的枚举实例。这应该可以解决问题。

我仍然需要手动枚举所有的52张卡片,这正是我试图避免的。我想减少源代码的数量,以便更容易理解等。 - Aaron J Lang

0

你链接的那本《手指疼痛之书》正是我想要避免的。 - Aaron J Lang

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接