自定义对象HashMap问题:创建第二个Location时出口数据被覆盖
问题分析与修复方案
问题根源
出口数据被覆盖的核心原因是**exits被声明为静态变量**。在Java中,静态变量属于类本身而非类的实例,所有Location对象会共享同一个HashMap<Direction, String>实例。创建第二个Location对象时,构造函数里的exits.put()操作会直接覆盖第一个对象存入的键值对,导致所有地点的出口数据完全一致。
修复步骤
只需对Location类做两处关键修改:
- 移除
exits变量的static修饰符,让每个Location实例拥有独立的出口集合 - 确保每个实例初始化自己的
exitsHashMap(声明时直接初始化即可)
修改后的Location类核心代码
public class Location extends Assets{ private String name; private String desc; public static HashMap<String, Location> map; // 去掉static,每个实例独立持有出口数据 private HashMap<Direction, String> exits = new HashMap<>(); public Location(String name) { super(name); String filename = "res/" + name + ".txt"; ArrayList<String> arr = new ArrayList<>(); try { BufferedReader br = new BufferedReader(new FileReader(filename)); String line; while((line = br.readLine())!= null) { String[] entry = line.replace(",", "").split("-",2); arr.add(entry[1]); } setName(arr.get(0)); setDesc(arr.get(1)); // 每个实例的exits独立,不会互相覆盖 exits.put(Direction.NORTH, arr.get(2)); exits.put(Direction.EAST, arr.get(3)); exits.put(Direction.SOUTH, arr.get(4)); exits.put(Direction.WEST, arr.get(5)); } catch (IOException e) { e.printStackTrace(); } } // 返回当前实例的非静态exits public HashMap<Direction, String> getExits() { return exits; } // 其他getter/setter方法保持不变 public String getName() { return name; } public void setName(String name) { this.name = name; } public String getDesc() { return desc; } public void setDesc(String desc) { this.desc = desc; } }
验证效果
修改后,创建riverbank和rabbithole实例时,各自会初始化独立的exits HashMap,读取对应文件的出口数据,不会再出现覆盖问题。调用readMap()方法时,每个地点的出口数据会正确显示自身配置。
内容的提问来源于stack exchange,提问作者Justice Brinston
相关产品推荐
相关产品推荐

