Java 封装和/或组织数据的策略
我有一个在大小和数据密度上都相当平均的应用程序,但我正试图找出封装数据的最佳方法,因为它需要在应用程序的许多地方使用 目前,我的所有数据、选项和状态都存储在一个大的“DataObject”中。它看起来像这样: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;
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个新类来保存状态,sampleFooDataObject
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
中作为字段结束。您能否更具体地说明数据的外观?我认为这是一个合理的问题,但如果没有更多细节,我认为很难找到解决方案。在这样的情况下,我发现自己通常会问一些问题,比如什么对分组有意义,事物之间的关系如何,谁需要使用这些对象,等等,而不知道具体情况