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

Java 封装和/或组织数据的策略,java,android,encapsulation,Java,Android,Encapsulation,我有一个在大小和数据密度上都相当平均的应用程序,但我正试图找出封装数据的最佳方法,因为它需要在应用程序的许多地方使用 目前,我的所有数据、选项和状态都存储在一个大的“DataObject”中。它看起来像这样: public class DataObject { public static final String M_READY_INTENT = "com.intent.action.M_READY" //and more... public static jsonRawFoos;

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

目前,我的所有数据、选项和状态都存储在一个大的“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 */
}
公共类数据对象{
公共静态最终字符串M\u READY\u INTENT=“com.INTENT.action.M\u READY”
//还有更多。。。
公共静态jsonRawFoos;
公共静态jsonRawBars;
//还有更多。。
私有静态HashMap catFoos=newhashmap();
私有静态HashMap catbar=newhashmap();
//还有更多。。
私有静态字符串会话;
//还有更多。。
私有静态布尔optFoo;
//还有更多。。
公共静态布尔数据状态=false;
//还有更多。。
/*静态存取器、静态数据处理器*/
}
总共有42个成员字段。这些必须在我的应用程序中的几个不同的活动和类中都可以访问。我考虑过在我的
MainActivity
中创建一个本地实例,并简单地通过接口
MainActivity
访问
DataObject
,但我不确定在任何地方传递接口都是正确的选择

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

编辑:

为了增加更多细节,我的应用程序发出API请求以获取3种不同类型对象的列表,我们将它们称为
Foo
Bar
Cat
。这些调用的结果是JSON格式的,因此在
IntentService
返回API调用的结果后,
DataObject
解析JSON并将生成的对象存储在
HashMap
s中

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

此外,用户可以设置影响应用程序中一个或多个
片段和
活动的特定选项。我也将这些设置放在了
DataObject

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

第二次编辑:

我忘了提到,
DataObject
也有责任在某些数据可用时通知应用程序的其余部分。

这是两个重要的概念,以便您尝试一个好的OO设计。

您应该更加关注内聚性,因为这将推动您决定如何组织数据

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

  • 这些字段是否相互关联
  • 这些字段是否可能定义对象的状态
根据字段的类型及其用途,您可以选择创建类或将它们保存在单个类中

查看您提供的相同代码,您将所有内容都设置为静态,字段看起来不像是定义对象或类的状态,因此可能将它们保留在一个类中看起来很好,但您可以做的一件事是将数据划分为两个类,再创建一个类,如
ApplicationConstants
,并将所有常量(如
static final String M_READY_INTENT=“com.INTENT.action.M_READY”
)放入该类中

我已经考虑在MainActivity中创建一个本地实例,然后 只需与MainActivity接口即可访问DataObject,但是 我不确定到处传递接口是否正确 选择权

您已经将所有内容都设置为静态,因此您甚至想要创建
DataObject
类的对象,只需使用静态getter和setter方法访问所有字段即可


根据OP的编辑进行更新

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

看起来您需要有3个不同的类来维护您称之为Foo、Bar和Cat的状态

因此,将这个
DataObject
类保留为您的超类,并在其中包含不需要唯一状态的字段,因此:

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个新类来保存状态,sample
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 ...
}
公共类FooDataObject扩展了DataObject{
公共jsonRawFoo;
public HashMap catFoos=new HashMap();
公开字符串会话;
公共布尔optFoo;
公共布尔数据状态=false;
//等等…更多的方法和getter/setter。。。
}
公共类BarDataObject扩展了DataObject{
公共JSONRAWPAR;
public HashMap catbar=new HashMap();
公开字符串会话;
公共布尔optBar;
公共布尔数据状态=false;
//等等…更多的方法和getter/setter。。。
}

因此,基本上,任何全局状态都将在
DataObject
中作为字段结束,而任何特定状态都将在
FooDataObject
CatDataObject
BarDataObject

中作为字段结束。您能否更具体地说明数据的外观?我认为这是一个合理的问题,但如果没有更多细节,我认为很难找到解决方案。在这样的情况下,我发现自己通常会问一些问题,比如什么对分组有意义,事物之间的关系如何,谁需要使用这些对象,等等,而不知道具体情况