我有几个关于 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/