首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java中的枚举类型和构建一套卡片

Java中的枚举类型和构建一套卡片
EN

Stack Overflow用户
提问于 2015-12-31 19:02:20
回答 2查看 461关注 0票数 3

关于Java中的枚举类型,我有几个问题。

我正在研究一本Java书籍,下面是构建一副卡片的代码:

下面是如何初始化一个未排序的甲板:

代码语言:javascript
复制
    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;
        }
}

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

代码语言:javascript
复制
    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包含以下内容:

代码语言:javascript
复制
public enum Suit {Spades, Hearts, Diamonds, Clubs};

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

这段代码说,类型类型的变量可以接受四个值中的一个。然后,我们可以在另一个类中编写以下代码。

代码语言:javascript
复制
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.");

输出将是

代码语言:javascript
复制
The suits are Spades and Hearts

在对变量s和t进行赋值时,我们必须使用Suit.Spades和Suit.Hearts,因为黑桃和心脏是仅在枚举类型匹配范围内定义的符号。然后,创建一副牌的代码可以变成以下内容:

代码语言:javascript
复制
    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,对吗?

为什么这个代码更好?

EN

回答 2

Stack Overflow用户

发布于 2015-12-31 19:28:14

getCardName(int,int )有两个int参数。只有4个可接受的西装值;如果传递大于4的套服值,则会在运行时得到数组超出界限的错误。

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

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

枚举方法更好,因为如果您交换两个不同类型的参数(即。一套西装和一份整数)。

是的,k++在后面增加,而++k则在前面增加。

票数 3
EN

Stack Overflow用户

发布于 2015-12-31 19:09:13

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

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

是。

如果他们的顺序不对怎么办?

枚举类型定义为类型安全。你不能犯上述的错误。他们更容易推理。它们可以封装功能。另见What's the advantage of a Java enum versus a class with public static final fields?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34550635

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档