Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我理解这个练习了吗';您的需求是否正确?_Java - Fatal编程技术网

Java 我理解这个练习了吗';您的需求是否正确?

Java 我理解这个练习了吗';您的需求是否正确?,java,Java,这是《Java艺术与科学》第6章中的编程练习 实现一个名为Card的新类,该类包括以下条目: •四套西装的命名常量(梅花、钻石、红桃、黑桃) 以及传统上用文字表示的四个等级(ACE, 杰克,王后,国王)。秩常数的值应为1,11, 分别为12和13 •一个建造师,接受等级和西装,并返回一张带有 这些价值观 •名为getRank和getSuit的Getter方法用于检索等级和西装 卡片的组成部分 •toString方法的实现,返回完整的 卡的名称如练习1所示。请记住,您可以使用+ 运算符将字符串的不

这是《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方法,用于检索卡的rank和suit组件。”

问题是要我返回int值还是字符串值(名称)

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

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

问题是要我返回int值还是字符串值(名称)

您所引用的解释并不是关于套装常量类型的具体说明,因此对我来说
int
是可以的。和getter按约定返回相应字段的类型

我的代码还有什么问题吗

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

  • cardRank
    转换为
    String
    最好使用
    String.valueOf(cardRank)
    ,而不是
    “”+cardRank
  • 由于您不希望卡片更改其等级或套装,您可以声明字段
    cardRank
    cardSuit
    final
    ,以强制执行此操作
  • 在处理
    toRankName
    toSuitName
    中意外的等级和等级值时,您应该保持一致-查找具有未知等级或等级的汽车是否错误?如果是这样,您应该抛出一个字符串,而不是返回另一个字符串
  • 理想情况下,具有一组闭合的可能值的此类类型将使用一个或多个实现。这将使您的
    开关
    语句变得不必要,并保证不会发生意外的诉讼或等级
问题是要我返回int值还是字符串值(名称)

您所引用的解释并不是关于套装常量类型的具体说明,因此对我来说
int
是可以的。和getter按约定返回相应字段的类型

我的代码还有什么问题吗

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

  • cardRank
    转换为
    String
    最好使用
    String.valueOf(cardRank)
    ,而不是
    “”+cardRank
  • 由于您不希望卡片更改其等级或套装,您可以声明字段
    cardRank
    cardSuit
    final
    ,以强制执行此操作
  • 在处理
    toRankName
    toSuitName
    中意外的等级和等级值时,您应该保持一致-查找具有未知等级或等级的汽车是否错误?如果是这样,您应该抛出一个字符串,而不是返回另一个字符串
  • 理想情况下,具有一组闭合的可能值的此类类型将使用一个或多个实现。这将使您的
    开关
    语句变得不必要,并保证不会发生意外的诉讼或等级

我认为您完全按照预期的方式实施了它

我看不出代码有任何错误,除了我不是命名常量的粉丝,我会使用枚举实现它,但因为这是一个要求

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

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

编辑:要使用枚举实现此功能,我将按如下方式执行:

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; 
} 

我想你实现了它,就像你应该做的那样

我看不出代码有任何错误,除了我不是命名常量的粉丝,我会使用枚举实现它,但因为这是一个要求

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

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

编辑:要使用枚举实现此功能,我将按如下方式执行:

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; 
} 

就需求而言,您的代码看起来非常合适

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

private String toRankName() {
    switch (cardRank) {
    case ACE:
        return ("Ace");
    case JACK:
        return ("Jack");
    ...
这些要求似乎有点奇怪,因为它们迫使您在需要时使用命名常量