java - Java 中的枚举类型和构建一副纸牌

标签 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];

文字接着说:

Furthermore, suppose he or she writes the following: System.out.println (getCardName(values[i],suits[i])); Note that the value is being passed where the suit is expected, and vice versa. This code will compile correctly, but incorrect behavior will occur at runtime.

为什么运行时会报错?我没看到? getCardName 不需要两个整数作为参数吗?

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

这里是建议的使用枚举类型的代码:

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

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

首先,这是我们声明枚举类型变量的方式吗?

此代码表示 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,因为 Spades 和 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对吧?

为什么这段代码更好?

最佳答案

getCardName(int s, int v) 有两个 int 参数。 可接受的花色只有 4 个;如果传递的花色值大于 4,则会在运行时出现数组越界错误。

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

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

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

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

关于java - Java 中的枚举类型和构建一副纸牌,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34550635/

相关文章:

java - 如何在不损失精度的情况下处理非常小的 float ?

java - 黑莓推送通知 : Is TomCat/MySQL really needed?

java - HashMap 迭代器不从集合中的第一个键开始

java - 如何在Java中为不同的对象创建单独的列表?

Java程序使用sqoop导入数据

java - Leiningen java-agents 不在 uberjar 中工作

java - 如果我加入已终止(死亡)的线程怎么办

java - 在java中,E,T有什么区别?

java - 抽象类和 Spring MVC @ModelAttribute/@RequestParam

java - Java绘图程序绘画时出现的多个问题