Java跨Game与Player类为私有hoursPlayed列表追加游玩时长的实现方法
代码修正与功能实现
现有代码基础编译问题排查
- Java关键字
class为小写写法,原代码中public Class Game、public Class Player的写法会直接触发编译错误 - Player类中
hoursPlayed属性缺少泛型声明,存储整数游玩时长需指定泛型为Integer - Player类构造方法中赋值语句变量名不匹配,方法参数为
playerNumber,原代码写为number会触发符号找不到的编译报错
功能实现逻辑
- 因
hoursPlayed是Player类的私有属性,禁止直接从Game类或外部修改,需在Player类中提供专属公开写入方法,封装列表追加逻辑,匹配管理员操作的权限控制要求 - 在Game类中提供管理员操作的匹配查找逻辑:通过唯一标识
playerNumber定位目标玩家,避免因重名导致时长加错账号 - 管理员操作入口直接对接已开发完成的游玩时长生成逻辑,找到对应玩家后调用Player的写入方法完成追加
修正后可运行代码
import java.util.ArrayList; import java.util.List; public class Game { private List<Player> players; public Game(){ players = new ArrayList<>(); players.add(new Player("Random Name", 20)); players.add(new Player("Random NameTwo", 200)); } // 管理员操作入口:传入目标玩家编号、本次生成的游玩时长 public boolean addPlayTimeForAdmin(int targetPlayerNumber, int playTime) { // 遍历匹配目标玩家 for (Player player : players) { if (player.getPlayerNumber() == targetPlayerNumber) { player.addSinglePlaySession(playTime); return true; } } // 未匹配到玩家返回操作失败标识 return false; } // 主方法测试逻辑 public static void main(String[] args) { Game gameInstance = new Game(); // 示例:管理员给编号20的玩家追加本次生成的45分钟游玩时长 boolean operateResult = gameInstance.addPlayTimeForAdmin(20, 45); System.out.println("操作执行结果:" + operateResult); } } class Player { // 明确泛型为Integer,存储每次独立游玩的时长记录 private List<Integer> hoursPlayed = new ArrayList<>(); private String name; private int playerNumber; public Player(String name, int playerNumber){ this.name = name; this.playerNumber = playerNumber; } // 封装游玩时长追加逻辑,外部无法直接修改列表内容 public void addSinglePlaySession(int playDuration) { this.hoursPlayed.add(playDuration); } // 提供只读访问方法供Game类匹配玩家 public int getPlayerNumber() { return playerNumber; } // 可选:计算玩家累计总游玩时长,方便管理员核对数据 public int getTotalPlayTime() { return hoursPlayed.stream().mapToInt(Integer::intValue).sum(); } }
开发注意事项
- 不要将Player类的
hoursPlayed列表设为public暴露,否则会绕过管理员操作逻辑产生非法数据修改 - 玩家匹配逻辑优先使用唯一标识
playerNumber,不要用姓名匹配,避免重名操作失误
内容的提问来源于stack exchange,提问作者Luke Golding
相关产品推荐
相关产品推荐

