Помогите Список очищается после его занесения...

  • Автор темы Автор темы Bars
  • Дата начала Дата начала

Bars

Старожил
Девелопер
Пользователь
Баллы
173
Java:
    public void loadConfiguration() throws IOException {
        File cfgFile = new File(this.getDataFolder() + File.separator + "config.yml");
        YamlConfiguration config = YamlConfiguration.loadConfiguration(cfgFile);
        if (!config.contains("items")) {
            config.createSection("items.35:0");
            config.set("items.35:0.skinblue", "35:11");
        }

        config.options().copyDefaults(true);
        config.save(cfgFile);
        items.clear();
        HashMap<String, String> temp = new HashMap<String, String>();
        for (String key : config.getConfigurationSection("items").getKeys(false)) {
            for (String skin : config.getConfigurationSection("items." + key).getKeys(false)) {
                if (config.contains("items." + key + "." + skin)) temp.put(skin, config.getString("items." + key + "." + skin));
                else continue;
            }

            items.put(key, temp);
            getLogger().info("before temp clr: "+items.get("35:0").toString());
            temp.clear();
            getLogger().info("after temp clr: "+items.get("35:0").toString());
        }
    }

На 19-й строчке я добавляю локальный хешмап temp в глобальный хешмап items, а после добавления temp'a я этот temp очищаю, после чего он по непонятным мне причинам очищается даже внутри items, в которой он уже был добавлен и забыт Джавой.
Смотрите сами:
Java:
[16:36:20] [Server thread/INFO]: [ItemSkin] Enabling ItemSkin v1.0
[16:36:20] [Server thread/INFO]: [ItemSkin] before temp clr: {skinblue=35:11}
[16:36:20] [Server thread/INFO]: [ItemSkin] after temp clr: {}
Но ведь temp уже занесён в items как не-temp! И должен меняться только по методу .put(ключ, изменённый temp)
 
Последнее редактирование:
Я могу и ошибаться, но по идее когда ты очищаешь темп, он очищается и в главной мапе, ведь это один и тот-же объект..
(P.S. Да, я хреново объясняю свои мысли :-( )
А может вариант просто не очищать ее?
Ведь все-равно конец метода, и больше ты ее вроде не используешь..
Ведь если ты сделаешь
Map map = items.get(key);
map.clear();
То map очистится в items также...
P.S. АХТУНГ: могу нести полный бред :D
 
Помните, что работая с объектами в Java, Вы работаете с указателями.
После очищения temp, указатели на объекты из temp равны null(размер массива соответственно устанавливается в ноль).
Чтобы избежать этого, нужно повторно выделять память.
Чтобы было более понятно:
Код:
temp.clear();
то же что:
Код:
items.get("35:0").clear();
 
Последнее редактирование:
Спасибо за объяснения, просто хотел узнать почему так. Сейчас я просто в каждой итерации цикла объявляю новый temp (старый удаляется т.к. он внутри for) :good:
 
В языке Java все примитивные типы передаются по значению, а все объекты — по ссылке.
Сперва ты создаёшь новый объект ( = new HashMap<>(...)), и присваиваешь ссылку на него переменной temp. Затем ты передаёшь ссылку на этот же объект в коллекцию items. Но это всё равно один и то же объект. Нужна полная копия объекта — реализуй Cloneable и метод clone(), либо снаружи создавай новый объект (new HashMap<>(temp)).
А фразу "забыт джавой" вообще пока стоит забыть. Что и когда она забывает это её личное дело :)
 
Назад
Верх