Java 将数据非线性解析为不可变对象

Java 将数据非线性解析为不可变对象,java,graph,immutability,Java,Graph,Immutability,我们使用最简单的方法将传入数据(JSON格式,但可以是XML或任何形式)转换为不可变的Java对象: // pseudocode Npc[] npcs; for (jsonNPC : jsonNPCs) { Quest[] quests; for (jsonQuest : jsonNPC.quests) { quests.add(new Quest(jsonQuest.get(foo), jsonQuest.get(bar), ...)); } npcs

我们使用最简单的方法将传入数据(JSON格式,但可以是XML或任何形式)转换为不可变的Java对象:

// pseudocode

Npc[] npcs;
for (jsonNPC : jsonNPCs) {

   Quest[] quests;
   for (jsonQuest : jsonNPC.quests) {
      quests.add(new Quest(jsonQuest.get(foo), jsonQuest.get(bar), ...));
   }

   npcs.add(new Npc(jsonNPC.get(name), quests, ...));

}
这很好,但会变得更复杂。我们现在想让任务引用其他
Quest
实例作为其“先决任务”

问题是,引用的任务可能只有在引用的任务被构造之后才被解析(输入数据没有顺序,也不可能,因为NPC之间可能存在双向引用)。这意味着我们不能在施工时连接它。但是因为
Quest
是不可变的,我们必须这样做

这样的问题通常是如何解决的


(注意:没有循环引用。我认为这应该会有所帮助)

如果先决条件任务总是放在json字符串中需要它们的任务之前,您可以简单地添加一个questID和一个prerequisiteQuestID字段,并存储所有按其ID排序的解析任务。如果出现prerequisiteQuestID,您可以从列表中选择任务


如果任务没有排序,你必须暂时存储它们。设计一个包含数据的可变类,填充数据,最后为所有任务创建真实的任务对象,并将它们添加到确定的列表中。

“如果任务没有排序”-就是这样。不过,一个临时图可以工作。您使用哪个json解析器?我很高兴使用json数据填充对象的私有字段。因此,您应该始终创建自己的json数据保存类,因为您不能依赖其他类的私有字段。我只想让gson将json解析成我自己类的结构,然后遍历这些类并创建所需的对象。它包含需要解析的引用、需要转换为不同类的类型参数等。