【问题标题】:Transparently storing class state without exposing implementation透明地存储类状态而不暴露实现
【发布时间】:2010-05-06 09:52:55
【问题描述】:

我有一个模型 (MVC) 类,我想存储它的内部状态(基本上包含私有 int 字段)。

该程序正在 Android 上运行(目前),因此我需要将其存储在 Bundle 中,但稍后我将在桌面应用程序中使用相同的类,我必须在其中存储其他状态方式,所以我不能在课堂上直接引用Bundle

所以我的问题是:在不暴露其实现的情况下存储(和检索)类的状态的最佳方法是什么?

我能想到的最好的办法是删除 private 访问修饰符,以便这些字段可以访问包并在同一个包中创建读/写帮助程序类,但这似乎是错误的。

【问题讨论】:

    标签: java android model-view-controller serialization


    【解决方案1】:

    我不熟悉 Android 上的持久性机制,但总的来说,将持久性逻辑(即存储对象状态的代码)与实际包含数据的域对象分开是个好主意。例如,这就是 JPA 和 Java 中几乎所有现代对象关系映射工具所采用的方法。所以是的,直接在域类中引用 Bundle 对象听起来不是正确的策略,尤其是如果您也打算在非 Android 环境中使用相同的类。

    我的建议是将对象状态序列化为可跨环境移植的 XML。有许多可用的开源工具可以帮助您轻松完成此操作,并且不需要您的域类中的任何特殊代码。我最熟悉的两个是JiBXCastor。我不知道两者是否适用于 Android,但即使 Android 有自己的工具来将对象转换为 XML 或从 XML 转换,您仍然可以在桌面端使用 JiBX 或 Castor,因为它们可以适应许多不同的XML 格式。

    获得 XML 格式的数据后,您可以使用最适合目标环境的任何方式将其持久化。在桌面应用程序上,这可能意味着用户主目录中的文件。在 Android 上,我想它会是捆绑包,但这不是我的专业领域。祝你好运!

    【讨论】:

    • Bundle 基本上是 Map<String, Object>Object 仅限于字符串,这些对象的原始类型和数组的形式。我可以在那里存储我的对象的 XML 表示,这样应该可以工作。感谢您的想法(也感谢 eMgz)!
    【解决方案2】:

    也看一下桥接模式:http://en.wikipedia.org/wiki/Bridge_pattern 正如 Rob 所说,您需要将持久性与数据对象解耦,这样您就可以统一处理数据,并使用桥接器来处理不同平台的持久性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-22
      • 2016-03-05
      • 2013-12-04
      • 1970-01-01
      • 2015-08-08
      • 2012-04-16
      相关资源
      最近更新 更多