如何用for循环简化PokerCard类toString方法的大量if语句?
解决PokerCard.toString()重复代码的方案
首先,你现在的问题核心是把牌的点数、花色的枚举值(或状态)转换成对应的显示字符串,一堆if/else完全没必要,下面给几个实用的替代方案:
方案1:给枚举加自定义显示属性(最推荐)
如果你的PokerCard里用了Rank和Suit枚举,直接给每个枚举常量绑定对应的显示字符串,不用任何条件判断:
// 定义点数枚举,每个常量带显示文本 enum Rank { ACE("A"), 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 final String displayText; Rank(String displayText) { this.displayText = displayText; } public String getDisplayText() { return displayText; } } // 定义花色枚举 enum Suit { CLUBS("♣"), DIAMONDS("♦"), HEARTS("♥"), SPADES("♠"); private final String displayText; Suit(String displayText) { this.displayText = displayText; } public String getDisplayText() { return displayText; } }
然后在PokerCard的toString里直接拼接:
public class PokerCard extends Card { private final Rank rank; private final Suit suit; // 构造方法等其他代码... @Override public String toString() { return rank.getDisplayText() + suit.getDisplayText(); } }
这个方案完全避免了条件判断,而且枚举的定义和显示逻辑绑定,后续要改显示文本(比如把"10"改成"T"),直接改枚举的构造参数就行,维护起来特别方便。
方案2:用数组映射ordinal值(适合不能改枚举的情况)
如果因为课程要求或者现有代码结构,没法给枚举加自定义属性,可以用数组和枚举的ordinal()对应(注意:枚举的ordinal是按定义顺序来的,所以数组顺序必须和枚举常量顺序完全一致):
public class PokerCard extends Card { private final Rank rank; private final Suit suit; // 顺序必须和Rank枚举的常量顺序一一对应 private static final String[] RANK_DISPLAY = {"A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"}; // 顺序必须和Suit枚举的常量顺序一一对应 private static final String[] SUIT_DISPLAY = {"♣", "♦", "♥", "♠"}; // 构造方法等其他代码... @Override public String toString() { return RANK_DISPLAY[rank.ordinal()] + SUIT_DISPLAY[suit.ordinal()]; } }
这个方案也不用写一堆if,代码量少,逻辑清晰,唯一要注意的就是数组顺序不能错,不然显示会乱。
关于for循环的问题
其实这里用for循环完全没必要——因为你要处理的是单张牌的点数和花色,不是遍历所有可能的牌。for循环适合批量处理集合,但单张牌的转换用上面两种方案比for循环直接得多,反而不会简化代码。
另外提醒一句:尽量别依赖ordinal()做业务逻辑,如果枚举的常量顺序被修改(比如把KING移到ACE前面),ordinal()的值会变,导致显示错误。所以方案1是更稳妥的选择。
内容的提问来源于stack exchange,提问作者Leeky
相关产品推荐
相关产品推荐

