【问题标题】:Weird stuff happening when moving objects from one YAML list to other将对象从一个 YAML 列表移动到另一个时发生的奇怪事情
【发布时间】:2021-06-04 17:03:20
【问题描述】:

我对 YAML 文件有疑问。 当我尝试在 .yml 文件中将对象从一个列表移动到另一个列表并保存时,会发生类似这样的奇怪事情:

queued: &id001 []
current: *id001

应该发生什么:

current: Fraithor # <= Minecraft username, from queued, moved when running reQueue()
queued: [] # <= Or just nothing / delete list

reQueue() 方法:


        for (String path : FileBasics.FILETYPE.BANWAVE.getConfig().getStringList("queued")) {

            List<String> list = FileBasics.FILETYPE.BANWAVE.getConfig().getStringList("current");
            List<String> arrayList = new ArrayList<>();
            arrayList.add(path);

            list.addAll(arrayList);
            FileBasics.FILETYPE.BANWAVE.getConfig().set("current", list);
            list.remove(path);
            FileBasics.FILETYPE.BANWAVE.getConfig().set("queued", list);
            try {
                FileBasics.FILETYPE.BANWAVE.getConfig().save(FileBasics.FILETYPE.BANWAVE.getFile());
            } catch (IOException e) {
                e.printStackTrace();
            }

        }
    }

显然,我使用单独的类/emnum 来保存文件 (FileBasics)。代码很长,所以我把它粘贴到了 pastebin HERE (https://pastebin.com/XsqvYTBb)

【问题讨论】:

    标签: java yaml bukkit


    【解决方案1】:

    您将同一个列表推送到currentqueued。 Java 具有引用语义,这意味着如果您将arrayList 推送到currentcurrent 将拥有对arrayList引用,因此如果您更改它,current 将指向更改后的列表。

    由于您将相同的列表推送到 queued,因此 YAML 将在列表第一次出现时添加锚点 &amp;id001,并在之后添加别名 *id001 以引用相同的列表。

    由于您根本不想要current 中的列表,因此您似乎想要这样做

    FileBasics.FILETYPE.BANWAVE.getConfig().set("current", path);
    

    虽然我不知道这是什么类型的 API,也不知道它是否接受字符串。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-12
      • 2019-05-18
      • 2012-06-30
      • 1970-01-01
      • 1970-01-01
      • 2011-09-16
      • 1970-01-01
      • 2018-04-30
      相关资源
      最近更新 更多