Java中的枚举类型并构建一副卡片

时间:2015-12-31 19:02:20

标签: java

我对Java中的枚举类型有几个问题。

我正在阅读一本Java书,这里是构建一副牌的代码:

以下是我们如何初始化未分类的套牌:

    int[] suits = new int[52];
    int[] values = new int[52];
    int k=0;
    for (int s=0; s<4; ++s) {
        for (int v=2; v<=14; ++v) {
            suits[k] = s;
            values[k++] = v;
        }
}

我们可以使用以下代码获取描述每张卡片的字符串:

    static String[] suitNames = {"Spades", "Hearts", "Clubs", "Diamonds"};
    static String[] faceCards = {"Jack", "Queen", "King", "Ace"};
    static String getCardName (int s, int v) {
        if (v <= 10)
            return v + " of " + suitNames[s];
        else
}
return faceCards[v-11] + " of " + suitNames[s];

文字说:

  

此外,假设他或她写下以下内容:       正在通过预期诉讼的System.out.println (getCardName(values[i],suits[i])); Note that the值,反之亦然。   此代码将正确编译,但会出现不正确的行为   运行时。

为什么运行时会出错?我不明白吗? getCardName不期望两个整数作为参数吗?

更一般地说,这段代码有什么问题?为什么我们需要枚举类型?

以下是使用枚举类型的建议代码:

假设一个文件Suit.java包含以下内容:

public enum Suit {Spades, Hearts, Diamonds, Clubs};

首先,这是我们如何声明enum类型的变量?

此代码表示Suit类型的变量可以采用四个值中的一个。然后我们可以在另一个类中编写以下代码。

Suit s = Suit.Spades;
Suit t = Suit.Hearts;
System.out.println ("The suits are " + s + " and " + t);
if (s.equals(t))
    System.out.println ("The suits match.");

输出为

The suits are Spades and Hearts

在对变量s和t进行赋值时,我们不得不说Suit.Spades和Suit.Hearts,因为黑桃和心是仅在枚举类型Suit中定义的符号。 创建一副牌的代码可以变成以下内容:

    Suit[] suits = new Suit[52];
    int[] values = new int[52];
    int k=0;
    for (Suit s : Suit.values()) {
        for (int v=2; v<=14; ++v) {
            suits[k] = s;
            values[k++] = v;
        }
}

这段代码对吗?最后的k ++只在正确使用该值后才递增k?

为什么这段代码更好?

2 个答案:

答案 0 :(得分:3)

getCardName(int s,int v)有两个int参数。 只有4个可接受的套装值;如果传递大于4的套装值,则在运行时会出现Array out of bounds错误。

可能的错误是混合了两个参数,如下所述: 调用getCardName(v,s);

编译器不会捕获这个;它是有效的,因为v和s都是int类型。

枚举方法更好,因为如果你交换两个不同类型的参数(即一个Suit和一个int),编译器会捕获。

是的,k ++在AFTER之后递增,而++ k将在之前递增。

答案 1 :(得分:1)

(这确实是一个评论,但很难读懂。)

  

为什么运行时会出错?我不明白吗? getCardName是否期望将两个整数作为参数?

是。

如果他们的订单错误会怎样?

根据定义,枚举类型是类型安全的。您无法进行上述类错误。他们更容易推理。它们可以封装功能。另请参阅What's the advantage of a Java enum versus a class with public static final fields?