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

时间:2011-11-03 17:45:09

标签: 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.add(new Npc(jsonNPC.get(name), quests, ...));

}

这很好用,但它变得更复杂。我们现在想让任务将其他Quest个实例称为“必备任务”。

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

这个问题通常如何解决?

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

1 个答案:

答案 0 :(得分:1)

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

如果没有订购任务,您必须暂时存储它们。设计一个保存数据的可变类,填充它,最后为所有这些任务创建真正的Quest对象,并将它们添加到明确的列表中。