【问题标题】:Java In-Application Storage from Xml Data来自 XML 数据的 Java 应用内存储
【发布时间】:2015-08-28 17:24:07
【问题描述】:

您好,我正在用 Java 开发一个用于学习目的的游戏,并且有一个关于应用内数据处理的问题

假设我有一堆 xml 文件存储各种统计数据、武器盔甲等,我将这些文件作为列表解析到我的应用程序中;

请注意,此数据永远不会改变,并且实际上是“最终的”,游戏将使用恒定数据。

现在我的问题是,您是否会将这些数据(供游戏运行时使用)存储在您可以轻松访问的应用程序中的一个类(在我的示例中为单例)中?因此,例如像这样(XML 解析器在其他地方读取了列表)

public class WeaponData {

   private List<Weapon> weaponData;

   public static final WeaponData instance = new WeaponData(parseXml("weapons"));


   private WeaponData(List<Weapon> data) {
       weaponData = data;
   }

   public static WeaponData getInstance() {
       return instance;
   }

   public List<Weapon> getWeaponData() {
       return weaponData;
   }
}

并允许我将数据用于

WeaponData.getInstance().getWeaponData();

如果是这样,这是解决方法,还是有更好的方法?

或者,我能想到的唯一替代方法是在需要时继续读取 XML(这似乎不明智,特别是,这种数据检索可能(至少对于商业应用程序)是网络操作,即使在我的如果它只是一个硬盘读取)。另外,如果有其他任何内容,它将是重复的代码。

感谢您的宝贵时间!

【问题讨论】:

  • 你能给我概述一下 XML 有多大吗,因为对于小的 XML 来说,将它们保存在数据库中需要做很多工作,而且收益并不多,你可以将值缓存在磁盘,但你会增加复杂性,这就是为什么对我来说知道 XML 文件的大小很重要。如果我们谈论的是 Kbs,我建议保持原样。
  • 请注意,final 仅与引用本身有关。对存储在final 变量中的对象的方法调用与final 的语义无关。所以,在你上面的例子中,有人可以在 List&lt;Weapon&gt; weaponData 创建后更改其内容
  • 好吧,我根本不是在谈论数据库。我想你误会了,我有一些 xml 文件,它们目前都是几 kbs,我怀疑它们会超过 500kbs 左右。但我只想知道您将如何在应用程序中(可能多次)提供这些数据。
  • @Keith,我知道,为了这个问题(不是我想知道的),我只是懒得进入不可变集合。不过还是谢谢!将在集合周围创建一个 Wrapper,以使其在实际实现时不可变。或 Collections.unmodifiableList 等

标签: java xml storage


【解决方案1】:

您可能应该将其读取一次并保存,但不要将其存储为单例。在初始化期间读取 WeaponData 并存储它的一个实例。如果您不喜欢这样,欢迎使用您建议的模式,但以后可能会很尴尬。

如果您在应用程序运行时到达了可能会更新 WeaponData 的地方,您可能想重新阅读它,但永远不会。

【讨论】:

  • 很抱歉对该答案的所有编辑——我重新阅读了这个问题,发现我第一次读错了。
  • 好的,所以总的来说我在正确的轨道上,我想通过它的声音做的事情,我想如果/何时(可能何时)尴尬将是一个很好的学习曲线我遇到它。编辑:没关系,我想这是一个相当困难的问题,所以可能有点难以理解
  • 当然,只要留意它 :)(顺便说一句,按照自己的方式做事然后学习的态度很棒)
  • @BillK “存储”它的一个实例是什么意思?
  • @Keith 好吧,如果您在方法中间使用 getInstance() ......您如何使用该对象的模拟版本对其进行测试?最好将其传入。这意味着您需要将该对象的实例保存在始终具有活动实例的类中的某个位置,例如您的主框架或您的事件可以访问的其他对象,并将其传递给需要它。当这变得太尴尬时(传递太多对象),依赖注入是通常用于简化事情的模式。
【解决方案2】:

我认为你的方法会奏效,尤其是当你提到数据不会变得足够大以至于它强加于内存时。另一个问题是您必须读取数据的频率。在这两个考虑因素之间需要权衡,但听起来 XML 很小,需要立即将 XML 解组为对象。

为了完整起见,您应该使用JAX-B 从您的 XML 模式生成 Java 类,而不是滚动您自己的解析器。

如果您担心 XML 的数据可能会发生变化,您可以考虑使用WatchService API 来检测变化并重新解析 XML 文件。

【讨论】:

  • 是的,确实是 JAXB,但是我没有在我的问题中提到它适用于 Android,并且 JAXB 不包含在 Android 中(如果我添加的话,我相信会显着增加我的 apk 的大小它)。本来可以使用 SimpleXml 之类的东西,但是因为它是为了学习,为什么不自己解析 XML 呢?你也正好在我应该使用依赖注入的上面。但我相信使用它会增加一层复杂性(实现),特别是在我希望为我的第二个“学习”应用程序保存的 Android 中。我相信 Dagger 在 Android 上运行得相当好
猜你喜欢
  • 2010-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-11
  • 1970-01-01
  • 2012-06-04
  • 1970-01-01
相关资源
最近更新 更多