我对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?
为什么这段代码更好?
答案 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?。