【问题标题】:Enumerate enum-instances with loop使用循环枚举枚举实例
【发布时间】:2012-01-30 01:19:20
【问题描述】:

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

写作

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);
        }
    }
}

我考虑过将 card 定义为包含 suit 和 face 字段的类,其中 suit 和 face 本身就是枚举。但是在其他情况下(例如小丑拥有红色和黑色的花色),这将允许创建无效的卡片对象(即方块小丑或红色 10)。

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

我不确定回答我自己的问题是否被认为是好的形式,但@Paul 只是给了我一个脑电波。 声明 Card 有一个私有构造函数,并使用 static Card getCard(suit, face) 在返回组合之前验证组合的方法。

【问题讨论】:

  • 也许enum 不是您想要的。您真的需要将这 3 个俱乐部称为 CLUBS_3 吗?
  • 是的,绝对 - 私有构造函数,SUIT 和 FACE 的单独枚举。

标签: java loops coding-style enums syntactic-sugar


【解决方案1】:

我不认为使用enum 可以做到这一点,但我们可以将implement 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++;
            }
        }
      }
}

编辑: 设置卡的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) 方法相结合是正确的方法。
  • 你可以这样做(使用枚举或普通类作为卡片)查看方法:public static Card instance(Rank rank,Suit suit) ... in *.com/questions/8626670/…
【解决方案2】:

我使用了一个枚举来表示排名、花色和卡片,它似乎工作得很好。代码见这个答案:Java: Enum or encoding with numbers?

【讨论】:

  • 你链接到的手指受伤的书正是我想要避免的
【解决方案3】:

我会说做两个枚举:一个用于每个面,另一个用于每张卡片。因此,在 Card Enum 中,每个枚举都有两个属性:卡片编号(如果您不觉得为此目的使用纯数字,您可以再制作一个枚举),以及作为 face 枚举实例的 face。这应该可以解决问题。

【讨论】:

  • 我仍然需要手动枚举所有 52 张卡,这是我试图避免的。我想减少来源的数量以便于理解等。
最近更新 更多