【问题标题】:Did I understand this exercise's requirements correctly?我是否正确理解了这个练习的要求?
【发布时间】:2012-04-16 08:09:24
【问题描述】:

这是 Java 艺术与科学第 6 章中的编程练习。

实现一个名为 Card 的新类,其中包含以下条目:

• 四种花色(俱乐部、钻石、红心、黑桃)的命名常量 以及传统上用文字表示的四个等级(ACE, 杰克、王后、国王)。秩常数的值应该是 1, 11, 分别是 12 和 13。

• 一个构造函数,它接受一个等级和一个花色并返回一张卡片 这些值。

• 名为 getRank 和 getSuit 的 Getter 方法用于检索排名和花色 卡片的组成部分。

• 返回完整的 toString 方法的实现 卡片名称,如练习 1 所示。请记住,您可以使用 + 运算符将字符串的不同部分连接在一起,如 如图中 Rational 类的 toString 实现所示 6-9.

我的代码:

/*
 * File: Card.java
 * 
 */

public class Card {

    /* Named Constants for ranks*/
    public static final int ACE = 1;
    public static final int JACK = 11;
    public static final int QUEEN = 12;
    public static final int KING = 13;

    /* Named Constants for suits*/
    public static final int CLUBS = 1;
    public static final int DIAMONDS  = 2;
    public static final int HEARTS = 3;
    public static final int SPADES = 4;

    public Card(int rank, int suit) {
        cardRank = rank;
        cardSuit = suit;
    }

    public int getRank() {
        return cardRank;
    }

    public int getSuit() {
        return cardSuit;
    }

    public String toString() {      
        return (toRankName() + " of " + toSuitName());
    }

    private String toRankName() {
        switch (cardRank) {
        case 1:
            return ("Ace");
        case 11:
            return ("Jack");
        case 12:
            return ("Queen");
        case 13:
            return ("King");
        default:
            return ("" + cardRank);
        }
    }

    private String toSuitName() {
        switch (cardSuit) {
        case 1:
            return ("Clubs");
        case 2:
            return ("Diamonds");
        case 3:
            return ("Hearts");
        case 4:
            return ("Spades");
        default:
            return ("Invalid");
        }
    }

    private int cardRank;
    private int cardSuit;
}

我不确定的部分是“名为 getRank 和 getSuit 的 Getter 方法,用于检索卡片的等级和花色组件。”

问题是要求我返回 int 值还是 String 值(名称)?

这是我第一次实现一个类。除了缺少JavaDoc cmets,我的代码还有什么问题吗?

编辑: 非常感谢所有回复的人!

【问题讨论】:

  • 你的代码看起来不错,但是这本书似乎已经过时了......
  • public String toString() 方法前面放一个@Override:这表明您正在覆盖父类的方法(在本例中为Object),而不是创建出现的新方法只在你的课堂上

标签: java


【解决方案1】:

就需求而言,您的代码看起来很准确。

我唯一的建议是在两个switch 语句中使用命名常量:

private String toRankName() {
    switch (cardRank) {
    case ACE:
        return ("Ace");
    case JACK:
        return ("Jack");
    ...

这些要求似乎有点奇怪,因为它们迫使您使用命名常量,而枚举可能更合适。

【讨论】:

  • 谢谢!这本书直到第 8 章才会介绍枚举,我认为这就是它要求命名常量的原因。
【解决方案2】:

问题是要求我返回 int 值还是 String 值(名称)?

您引用的解释没有具体说明西装常量的类型,所以对我来说int 很好。而 getter 按照约定返回对应字段的类型。

我的代码还有什么问题吗?

我看不出有什么明显的错误,尽管有一些地方可以改进(但我想其中大部分只出现在本书后面的章节中,所以在那之前可以跳过这些):

  • cardRank 转换为String 最好使用例如String.valueOf(cardRank),而不是"" + cardRank
  • 由于您不希望卡片改变其等级或花色,您可以声明字段 cardRankcardSuit final 以强制执行此操作
  • 您应该始终如一地处理toRankNametoSuitName 中的意外等级和套装值 - 查找具有未知套装或等级的汽车是错误的吗?如果是这样,你应该抛出一个exception 而不是返回另一个字符串
  • 理想情况下,此类具有一组可能值的封闭类型将使用一个或多个enums 来实现。这将使您的switch 声明变得不必要,并保证不会出现意外的花色或排名

【讨论】:

  • 非常感谢您的建议
【解决方案3】:

我会像你一样解释它。 getRank 和 getSuit 在它们现在的实现方式上更有用,如果您打算在某种关心它们值的程序中使用这个类。例如,如果您编写一个扑克游戏程序,您不希望仅仅为了检查牌的等级而进行字符串比较,因此让访问器返回是有益的。

您询问您的课程是否还有其他问题 - 它的实施方式确实符合问题的要求,但我对问题本身提出质疑。我认为将西装和排名实现为枚举会更干净,这将有助于防止通过编译时检查创建无效的卡片对象。如果您不了解枚举,请检查

http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html

您还可以在构造函数中进行检查,以确保仅传入有效的参数,如果不是,则抛出异常。这些提示可能超出了问题的范围,但我建议使用它们,因为从风格上讲,我认为它们会导致更不容易出错的代码。

干杯!

【讨论】:

    【解决方案4】:

    我认为你实现它的方式完全符合你的预期。

    我看不出代码有什么问题,只是我不是命名常量的粉丝,并且会使用枚举来实现它,但因为这是必需的......

    编辑: 由于您在构造函数中将 rank 和 suite 的值作为 int 值传递,因此您还应该在 getter 方法中像这样返回它们。调用代码应该使用这些方法和命名常量来实现逻辑,而不是在这里使用字符串值。

    正如 aix 指出的那样,您应该在自己的代码中执行相同的操作(使用常量名称而不是幻数)。

    编辑:要使用枚举来实现这一点,我会这样做:

    public enum Suit
    {
        CLUB("Club"), DIAMOND("Diamond"), HEART("Heart"), SPADE("Spade");
    
        String name;
        Suit(String name)
        {
            this.name=name;
        }
    
        @Override
        public String toString()
        {
            return name;
        }
    }
    
    public enum Rank
    {
        ACE("Ace", 1), JACK("Jack", 11), QUEEN("Queen", 12), KING("King", 13); //add other cards
    
        int value;
        String name;
        Rank(String name, int value)
        {
            this.name=name;
            this.value=value;
        }
    
        @Override
        public String toString()
        {
            return name;
        }
    }
    
    public class Card { 
    
        public Card(Rank rank, Suit suit) { 
            cardRank = rank; 
            cardSuit = suit; 
        } 
    
        public Rank getRank() { 
            return cardRank; 
        } 
    
        public Suit getSuit() { 
            return cardSuit; 
        } 
    
        @Override
        public String toString() {       
            return (cardRank + " of " + cardSuit); 
        } 
    
        private Rank cardRank; 
        private Suit cardSuit; 
    } 
    

    【讨论】:

    • 感谢您提供示例代码。当我进入关于枚举的章节时,它将对我有很大帮助
    【解决方案5】:

    Get/Set 方法通常返回与其关联的成员变量的类型。在您的情况下,getSuit()cardSuit 相关联,getRankcardRank 相关联。

    请注意,这不是必需的:您可以根据需要返回字符串表示形式,这通常取决于代码的用途。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-03
      • 1970-01-01
      • 2022-10-17
      • 1970-01-01
      • 1970-01-01
      • 2020-09-30
      相关资源
      最近更新 更多