You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自定义对象HashMap问题:创建第二个Location时出口数据被覆盖

问题分析与修复方案

问题根源

出口数据被覆盖的核心原因是**exits被声明为静态变量**。在Java中,静态变量属于类本身而非类的实例,所有Location对象会共享同一个HashMap<Direction, String>实例。创建第二个Location对象时,构造函数里的exits.put()操作会直接覆盖第一个对象存入的键值对,导致所有地点的出口数据完全一致。

修复步骤

只需对Location类做两处关键修改:

  1. 移除exits变量的static修饰符,让每个Location实例拥有独立的出口集合
  2. 确保每个实例初始化自己的exits HashMap(声明时直接初始化即可)

修改后的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 21:11:02