这是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注释外,我的代码还有什么问题吗?
修改: 非常感谢所有回复的人!
答案 0 :(得分:3)
就需求而言,您的代码看起来很有用。
我唯一的建议是在两个switch
语句中使用命名常量:
private String toRankName() {
switch (cardRank) {
case ACE:
return ("Ace");
case JACK:
return ("Jack");
...
这些要求似乎有些奇怪,因为它们会强制您使用命名常量,其中枚举可能更合适。
答案 1 :(得分:2)
问题是要求我返回int值还是String值(Name)?
你引用的解释并没有具体说明套装常量的类型,所以对我来说int
没问题。按照惯例,getter返回相应字段的类型。
我的代码还有什么问题吗?
我没有看到任何明显错误的东西,虽然有一些事情可以改进(但我想大部分都只出现在本书后面的章节中,所以在此之前可以自由跳过这些):< / p>
答案 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
相关联,getRank
与cardRank
相关联。
请注意,这不是必需的:如果需要,可以返回String表示,通常取决于代码的用途。
答案 4 :(得分:1)
我会像你一样解释它。 getRank和getSuit对于它们现在实现的方式更有用,如果你打算在某种关心它们的值的程序中使用这个类。例如,如果你写一个扑克游戏程序,你不会想做一个字符串比较只是为了检查卡的等级,所以让访问者返回是有益的。
你问你的班级是否还有其他问题 - 它的实施方式确实符合问题的要求,但我对问题本身提出质疑。我认为实现套装和排名作为枚举会更干净,这有助于防止使用编译时检查创建无效的卡对象。如果您不了解枚举,请检查
http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html
您还可以检查构造函数以确保只传入有效的params,如果不是则抛出异常。这些提示可能超出了问题的范围,但我建议它们因为风格上我认为它们会导致更少错误的代码。
干杯!