我是否正确理解了这项练习的要求?

时间:2012-04-02 16:37:48

标签: java

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

  

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

     

•四件套装的命名常数(CLUBS,DIAMONDS,HEARTS,SPADES)   传统上用文字表示的四个等级(ACE,   JACK,QUEEN,KING)。等级常数的值应为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;
}

我不确定的部分是“Getter方法命名为getRank和getSuit来检索等级并适合卡片的组件。”

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

这是我第一次实施课程。除了缺少JavaDoc注释外,我的代码还有什么问题吗?

修改: 非常感谢所有回复的人!

5 个答案:

答案 0 :(得分:3)

就需求而言,您的代码看起来很有用。

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

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

这些要求似乎有些奇怪,因为它们会强制您使用命名常量,其中枚举可能更合适。

答案 1 :(得分:2)

  

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

你引用的解释并没有具体说明套装常量的类型,所以对我来说int没问题。按照惯例,getter返回相应字段的类型。

  

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

我没有看到任何明显错误的东西,虽然有一些事情可以改进(但我想大部分都只出现在本书后面的章节中,所以在此之前可以自由跳过这些):< / p>

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

答案 2 :(得分:1)

我认为你完全按照预期实现了它。

我没有看到代码有什么问题,除了我不是真正的命名常量的粉丝,并且会使用枚举来实现它,但因为这是要求......

编辑:由于您在构造函数中将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; 
} 

答案 3 :(得分:1)

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

请注意,这不是必需的:如果需要,可以返回String表示,通常取决于代码的用途。

答案 4 :(得分:1)

我会像你一样解释它。 getRank和getSuit对于它们现在实现的方式更有用,如果你打算在某种关心它们的值的程序中使用这个类。例如,如果你写一个扑克游戏程序,你不会想做一个字符串比较只是为了检查卡的等级,所以让访问者返回是有益的。

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

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

您还可以检查构造函数以确保只传入有效的params,如果不是则抛出异常。这些提示可能超出了问题的范围,但我建议它们因为风格上我认为它们会导致更少错误的代码。

干杯!