关于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 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[] 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,对吗?
为什么这个代码更好?
发布于 2015-12-31 19:28:14
getCardName(int,int )有两个int参数。只有4个可接受的西装值;如果传递大于4的套服值,则会在运行时得到数组超出界限的错误。
可能的错误是混合了这两个参数:调用getCardName(v,s);
编译器不会捕捉到这一点;它是有效的,因为v和s都是int类型。
枚举方法更好,因为如果您交换两个不同类型的参数(即。一套西装和一份整数)。
是的,k++在后面增加,而++k则在前面增加。
发布于 2015-12-31 19:09:13
(这确实是一个评论,但很难读懂。)
为什么运行时会出现错误?我没看到?getCardName不需要两个整数作为参数吗?
是。
如果他们的顺序不对怎么办?
枚举类型定义为类型安全。你不能犯上述的错误。他们更容易推理。它们可以封装功能。另见What's the advantage of a Java enum versus a class with public static final fields?。
https://stackoverflow.com/questions/34550635
复制相似问题