gpt4 book ai didi

java - 封装和/或组织数据的策略

转载 作者:行者123 更新时间:2023-11-30 01:47:03 24 4
gpt4 key购买 nike

我有一个在大小和数据密度方面相当平均的应用程序,但我正在尝试找出封装数据的最佳方法,因为它需要在应用程序周围的许多地方使用。

目前,我将所有数据、选项和状态都存储在一个大“DataObject”中。它看起来像这样:

public class DataObject {
public static final String M_READY_INTENT = "com.intent.action.M_READY"
//and more...
public static jsonRawFoos;
public static jsonRawBars;
//and more..
private static HashMap<String, Foo> catFoos = new HashMap<>();
private static HashMap<String, Bar> catBars = new HashMap<>();
//and more..
private static String session;
//and more..
private static boolean optFoo;
//and more..
public static boolean dataState = false;
//and more..

/* Static accessors, static data processors */
}

总共有 42 个成员字段。这些必须可以在我的应用程序中的几个不同的 Activity 和类中访问。我考虑过在我的 MainActivity 中创建一个本地实例并简单地连接 MainActivity 以访问 DataObject,但我不确定在任何地方传递接口(interface)都是正确的选择。

总结一下我的问题,什么是封装/组织我的数据的最佳方法,以使其在多个不同的对象中可用,同时保持我的代码干净、内存高效,并在暂停/恢复/挂起事件期间避免崩溃?

编辑:

为了添加更多细节,我的应用发出 API 请求以获取 3 种不同对象的列表,我们称它们为 FooBar。这些调用的结果都是 JSON 格式的,所以在 IntentService 返回 API 调用的结果后,DataObject 解析 JSON 并将生成的对象存储在 HashMaps.

MainActivity 中包含的 Fragments 中的适配器需要访问生成的列表对象。还有其他 Activity 偶尔需要访问这些对象列表。

此外,用户可以设置某些选项来影响整个应用程序中的一个或多个 FragmentActivity。我也将这些设置放在 DataObject 中。

最后,应用程序有时需要知道哪些数据已准备就绪,以及在确定下一步行动之前是否已清除其他特定状态。我也将这些状态保存在 DataObject 中。

第二次编辑:

我忘了说,DataObject 还负责在某些数据可用时通知应用程序的其余部分。

最佳答案

CohesionCoupling是 2 个重要的概念,以便您尝试进行良好的 OO 设计。

您应该更关心内聚性,因为这将插入决定如何组织数据。

您需要问自己的关键问题如下(因为您没有提供所有数据,所以您需要思考并问自己):

  • 这些字段是否相互关联
  • 这些字段是否可能定义对象的状态

根据字段的类型和用途,您可以选择创建类或将它们保留在单个类中。

查看您提供的相同代码,您已将所有内容设为静态,并且字段看起来不像定义对象或类的状态,因此可能将它们保留在一个类中看起来不错,但您可以做的一件事是将2 类中的数据,再创建一个类,如 ApplicationConstants并把所有常量都写成 static final String M_READY_INTENT = "com.intent.action.M_READY"在那个类(class)。

I've considered just creating a local instance in my MainActivity and simply interfacing MainActivity to get access to the DataObject, but I'm not sure that passing an interface everywhere is the correct option.

您已将所有内容设为静态,所以为什么还要创建 DataObject 的对象?类,只需使用静态 getter 和 setter 方法访问所有字段。


根据 OP 的编辑更新。

免责声明:我不了解您的 DataObject 类的所有字段及其用途,因此以下设计基于提供的信息

看起来您需要 3 个不同的类来维护您所谓的 Foo、Bar 和 Cat 的状态。

所以,保留这个 DataObject类作为您的父类(super class)并在其中包含不需要唯一状态的字段,因此:

public class DataObject {
public static final String M_READY_INTENT = "com.intent.action.M_READY"
// Code for informing the rest of the application when certain data has become available. Could be static ...
//Anything else which is not unique and is not dependent on Foo, Cat or Bar...
}

然后创建 3 个新类来保存状态,示例 FooDataObject

public class FooDataObject extends DataObject {
public jsonRawFoo;
public HashMap<String, Foo> catFoos = new HashMap<>();
public String session;
public boolean optFoo;
public boolean dataState = false;
//Etc... more methods and getter/setter ...
}


public class BarDataObject extends DataObject {
public jsonRawBar;
public HashMap<String, Foo> catBars = new HashMap<>();
public String session;
public boolean optBar;
public boolean dataState = false;
//Etc... more methods and getter/setter ...
}

所以,基本上任何全局状态的东西最终都会成为 DataObject 中的一个字段。 , 任何特定状态的东西最终都会成为 FooDataObject 中的一个字段或 CatDataObjectBarDataObject .

关于java - 封装和/或组织数据的策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33571850/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com