构造方法链调用报错:Yahtzee游戏多构造方法实现求助
解决Yahtzee游戏构造方法的调用问题
这个问题我之前也碰到过,Java规定构造方法中调用其他构造方法(this())必须是第一条语句,所以你在YahtzeeGame(int numberOfPlayers)里先创建数组再调用this(playerNames)就违反了这个规则。下面给你两种简单的解决思路,另外也聊聊你问的工厂模式是否有必要:
方案一:抽离默认名称生成逻辑为静态方法
把生成默认玩家名称的逻辑写成一个静态方法,这样就能在this()调用中直接使用它的返回值,满足“构造方法调用是第一条语句”的要求:
public class YahtzeeGame { private List<Player> players = new ArrayList<>(); // 静态方法:生成指定数量的默认玩家名称 private static String[] generateDefaultPlayerNames(int numberOfPlayers) { String[] names = new String[numberOfPlayers]; for (int i = 0; i < numberOfPlayers; i++) { names[i] = "Unnamed Player " + (i + 1); } return names; } public YahtzeeGame(String[] playerNames) { for (String playerName : playerNames) { players.add(new Player(playerName)); } } public YahtzeeGame(int numberOfPlayers) { // 现在this()是第一条语句,符合规则 this(generateDefaultPlayerNames(numberOfPlayers)); } public YahtzeeGame(String playerName) { this(new String[] {playerName}); } public YahtzeeGame() { this("Unnamed Player 1"); } }
方案二:统一玩家初始化逻辑到私有方法
如果不想用静态方法,也可以把添加玩家的逻辑抽成一个私有初始化方法,让所有构造方法都调用这个方法,避开构造方法互相调用的顺序限制:
public class YahtzeeGame { private List<Player> players = new ArrayList<>(); public YahtzeeGame(String[] playerNames) { initializePlayers(playerNames); } public YahtzeeGame(int numberOfPlayers) { String[] playerNames = new String[numberOfPlayers]; for (int i = 0; i < numberOfPlayers; i++) { playerNames[i] = "Unnamed Player " + (i+1); } initializePlayers(playerNames); } public YahtzeeGame(String playerName) { initializePlayers(new String[] {playerName}); } public YahtzeeGame() { initializePlayers(new String[] {"Unnamed Player 1"}); } // 私有方法:统一处理玩家初始化 private void initializePlayers(String[] playerNames) { for (String playerName : playerNames) { players.add(new Player(playerName)); } } }
关于工厂模式的疑问
其实当前你的需求用上面两种方案完全可以解决,暂时不需要工厂模式。工厂模式一般是在对象创建逻辑复杂(比如需要根据不同参数创建不同子类对象)、或者需要隐藏创建细节、或者需要批量创建对象时才会用到。你的场景只是生成默认玩家名称,用构造方法重载加上简单的逻辑抽离就足够了,没必要引入额外的设计模式。如果之后你有更复杂的玩家创建需求(比如支持不同类型的玩家、从配置文件读取玩家信息等),再考虑引入工厂模式也不迟。
内容的提问来源于stack exchange,提问作者Rick
相关产品推荐
相关产品推荐

