我只为我的最终变量分配一个值,但我仍然收到错误
I'm only assigning one value to my final variable but still I'm getting an error
我在使我的实例字符串 cardRank 和 cardSuit 最终化时遇到错误,我认为我在我的代码中只为它们赋值一次。
我已经在我的代码中评论了我正在谈论的那些。
import java.util.Arrays;
public class Card{
protected static final String[] SUITS = {"spades", "clubs", "hearts", "diamonds"};
protected static final String[] RANKS = {"1","2","3","4","5","6","7","8","9","10","J","Q","K"};
private String cardRank; // I want to make this final
private String cardSuit; // I want to make this final
public Card(){
this(RANKS[(int) (Math.random() * RANKS.length)] , SUITS[(int) (Math.random() * SUITS.length)]);
}
public Card(String cardRank, String cardSuit){
setRank(cardRank);
setSuit(cardSuit);
}
private boolean isValidRank(String cardRank){
cardRank = cardRank.toUpperCase();
return Arrays.asList(RANKS).contains(cardRank);
}
private boolean isValidSuit(String cardSuit){
cardSuit = cardSuit.toLowerCase();
return Arrays.asList(SUITS).contains(cardSuit);
}
private void setRank(String cardRank){
if(isValidRank(cardRank)) this.cardRank = cardRank;
else this.cardRank = "Invalid Suit";
}
private void setSuit(String cardSuit){
if(isValidSuit(cardSuit)) this.cardSuit = cardSuit;
else this.cardSuit = "Invalid Suit";
}
public String getRank(){
return cardRank;
}
public String getSuit(){
return cardSuit;
}
public void printCard(){
System.out.println(getSuit() + " " + getRank());
}
}
您只能 分配给构造函数主体内的 final
字段(或作为声明的一部分,或实例初始化程序)。所以基本上,您应该放弃 setSuit
和 setRank
方法。
public Card(String cardRank, String cardSuit) {
this.cardRank = isValidCardRank(cardRank) ? "Invalid rank";
this.cardSuit = isValidCardSuit(cardSuit) ? "Invalid suit";
}
或更好:
public Card(String cardRank, String cardSuit) {
this.cardRank = validateRank(cardRank);
this.cardSuit = validateSuit(cardSuit);
}
如果有效无效,validate*
方法将抛出 IllegalArgumentException
。
或者更好的是,制作 Suit
和 Rank
枚举,因此 只有 值是有效值,您只需要检查是否为空。 ..
如果您想使用 enum
,这里是您的卡片示例 class。不需要验证,因为 passable 的参数只在定义的 enum
范围内。由于 RANK 和 SUIT 是最终的,因此您不需要为它们设置方法。
public class Card {
public enum SUIT {SPADE, CLUB, HEART, DIAMOND};
public enum RANK {
ACE("1"), TWO("2"), THREE("3"), FOUR("4"), FIVE("5"), SIX("6"), SEVEN("7"), EIGHT("8"), NINE("9"), TEN("10"), JACK("J"), QUEEN("Q"), KING("K");
private String value;
private RANK(String value) {
this.value = value;
}
public String getValue() {
return this.value;
}
};
private final SUIT cardSuit;
private final RANK cardRank;
/**
* Creates a Specific Card
*/
public Card(SUIT cardSuit, RANK cardRank) {
this.cardSuit = cardSuit;
this.cardRank = cardRank;
}
/**
* Generate a Random Card
*/
public Card(){
this(RANK.values()[(int) (Math.random() * RANK.values().length)] , SUIT.values()[(int) (Math.random() * SUIT.values().length)]);
}
public String getSuit() {
return cardSuit.toString();
}
public String getRank() {
return cardRank.getValue();
}
public void printCard() {
System.out.println(getSuit() + " " + getRank());
}
}
我在使我的实例字符串 cardRank 和 cardSuit 最终化时遇到错误,我认为我在我的代码中只为它们赋值一次。 我已经在我的代码中评论了我正在谈论的那些。
import java.util.Arrays;
public class Card{
protected static final String[] SUITS = {"spades", "clubs", "hearts", "diamonds"};
protected static final String[] RANKS = {"1","2","3","4","5","6","7","8","9","10","J","Q","K"};
private String cardRank; // I want to make this final
private String cardSuit; // I want to make this final
public Card(){
this(RANKS[(int) (Math.random() * RANKS.length)] , SUITS[(int) (Math.random() * SUITS.length)]);
}
public Card(String cardRank, String cardSuit){
setRank(cardRank);
setSuit(cardSuit);
}
private boolean isValidRank(String cardRank){
cardRank = cardRank.toUpperCase();
return Arrays.asList(RANKS).contains(cardRank);
}
private boolean isValidSuit(String cardSuit){
cardSuit = cardSuit.toLowerCase();
return Arrays.asList(SUITS).contains(cardSuit);
}
private void setRank(String cardRank){
if(isValidRank(cardRank)) this.cardRank = cardRank;
else this.cardRank = "Invalid Suit";
}
private void setSuit(String cardSuit){
if(isValidSuit(cardSuit)) this.cardSuit = cardSuit;
else this.cardSuit = "Invalid Suit";
}
public String getRank(){
return cardRank;
}
public String getSuit(){
return cardSuit;
}
public void printCard(){
System.out.println(getSuit() + " " + getRank());
}
}
您只能 分配给构造函数主体内的 final
字段(或作为声明的一部分,或实例初始化程序)。所以基本上,您应该放弃 setSuit
和 setRank
方法。
public Card(String cardRank, String cardSuit) {
this.cardRank = isValidCardRank(cardRank) ? "Invalid rank";
this.cardSuit = isValidCardSuit(cardSuit) ? "Invalid suit";
}
或更好:
public Card(String cardRank, String cardSuit) {
this.cardRank = validateRank(cardRank);
this.cardSuit = validateSuit(cardSuit);
}
如果有效无效,validate*
方法将抛出 IllegalArgumentException
。
或者更好的是,制作 Suit
和 Rank
枚举,因此 只有 值是有效值,您只需要检查是否为空。 ..
如果您想使用 enum
,这里是您的卡片示例 class。不需要验证,因为 passable 的参数只在定义的 enum
范围内。由于 RANK 和 SUIT 是最终的,因此您不需要为它们设置方法。
public class Card {
public enum SUIT {SPADE, CLUB, HEART, DIAMOND};
public enum RANK {
ACE("1"), TWO("2"), THREE("3"), FOUR("4"), FIVE("5"), SIX("6"), SEVEN("7"), EIGHT("8"), NINE("9"), TEN("10"), JACK("J"), QUEEN("Q"), KING("K");
private String value;
private RANK(String value) {
this.value = value;
}
public String getValue() {
return this.value;
}
};
private final SUIT cardSuit;
private final RANK cardRank;
/**
* Creates a Specific Card
*/
public Card(SUIT cardSuit, RANK cardRank) {
this.cardSuit = cardSuit;
this.cardRank = cardRank;
}
/**
* Generate a Random Card
*/
public Card(){
this(RANK.values()[(int) (Math.random() * RANK.values().length)] , SUIT.values()[(int) (Math.random() * SUIT.values().length)]);
}
public String getSuit() {
return cardSuit.toString();
}
public String getRank() {
return cardRank.getValue();
}
public void printCard() {
System.out.println(getSuit() + " " + getRank());
}
}