我们使用最简单的方法将传入的数据(使用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
是不可变的,我们必须这样做。
这个问题通常如何解决?
(注意:没有循环引用。我认为这应该有帮助)
答案 0 :(得分:1)
如果先决条件任务总是放在json字符串之前需要它们的任务,你可以简单地添加一个questID和一个prerequisiteQuestID字段,并存储按其id排序的所有已解析任务。如果出现prerequisiteQuestID,您可以从列表中选择任务。
如果没有订购任务,您必须暂时存储它们。设计一个保存数据的可变类,填充它,最后为所有这些任务创建真正的Quest对象,并将它们添加到明确的列表中。