- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个在大小和数据密度方面相当平均的应用程序,但我正在尝试找出封装数据的最佳方法,因为它需要在应用程序周围的许多地方使用。
目前,我将所有数据、选项和状态都存储在一个大“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 种不同对象的列表,我们称它们为 Foo
、Bar
和 猫
。这些调用的结果都是 JSON 格式的,所以在 IntentService
返回 API 调用的结果后,DataObject
解析 JSON 并将生成的对象存储在 HashMap
s.
MainActivity
中包含的 Fragments
中的适配器需要访问生成的列表对象。还有其他 Activity 偶尔需要访问这些对象列表。
此外,用户可以设置某些选项来影响整个应用程序中的一个或多个 Fragment
和 Activity
。我也将这些设置放在 DataObject
中。
最后,应用程序有时需要知道哪些数据已准备就绪,以及在确定下一步行动之前是否已清除其他特定状态。我也将这些状态保存在 DataObject
中。
第二次编辑:
我忘了说,DataObject
还负责在某些数据可用时通知应用程序的其余部分。
最佳答案
Cohesion和 Coupling是 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
中的一个字段或 CatDataObject
或 BarDataObject
.
关于java - 封装和/或组织数据的策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33571850/
我需要使用封装打印3个变量,并且无法修改主类。 主类声明变量[汽缸、制造商、所有者],并希望使用如下参数创建和打印一个对象: System.out.println (new Vehicle (cyli
我正在研究“Beginning Ruby”这本书,在我进行封装之前一切都进行得很顺利。我明白这段代码在做什么,我只是不知道为什么要用这些方法设置它。 对于那些感兴趣的人 this is the lin
所以我一直在研究面向对象的完整开发 JavaScript 实践,并对以下示例感到好奇。 据我了解,(这对我来说很有意义)以下“ secret ”字段是“私有(private)”的: var MyObj
在面向对象程式设计方法中,封装(英语:Encapsulation)是指,一种将抽象性函式接口的实作细节部份包装、隐藏起来的方法。 封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代
封装 被定义为 把一个或多个项目封闭在一个物理的或者逻辑的包中 。在面向对象程序设计方法论中,封装是为了防止对实现细节的访问。 抽象和封装是面向对象程序设计的相关特性。抽象允许相关信息可
今天我读了一本书,作者写道,在一个设计良好的类中,访问属性的唯一方法是通过其中一个类方法。这是一个被广泛接受的想法吗?为什么封装属性如此重要?不做会有什么后果?我早些时候在某处读到这可以提高安全性或类
今天我接受了软件工程职位的面试。我已经从 stackoverflow 中阅读了很多关于面试的内容。他们向我询问了与 OOP 相关的正常情况。但他们也问我这些: 没有继承就可以封装吗? 没有继承就可以抽
我正在制作一个简单的网站,并编写了gradle构建脚本,该脚本将执行诸如lint并最小化css / html / js之类的事情。 在这一阶段,我刚刚完成了正在运行的CSS,但是只是初始的非结构化格式
下面的幻灯片是指 C++ 语言,它说 "encapsulation is about ensuring the user uses our ADT in a safe way" 但是,如果他可以访问我
尝试设置一个 Person 类 我在尝试将信息封装在类中以使其不会被意外更改时遇到了问题。除了当我尝试使用 setter/getters 进行封装时,该类工作得非常好。我认为问题是这些方法最终会互相循
面向对象的概念:封装、数据抽象和数据隐藏是3个不同的概念,但彼此之间非常相关。所以我很难通过阅读互联网上的信息来完全理解这些概念。一个地方可用的信息与互联网上另一个地方的信息相矛盾。有人可以指导我阅读
我被封装困住了。在我看来,好像我已经按照规则做了一切,但仍然不起作用。虽然我知道我错过了一些东西。我正在使用 Eclipse。 我想要通过创建一副标准 52 张卡片来进行一些练习,并尝试我学到的新东西
在java中,要获取映射中的所有键,我们可以使用方法keySet。但我想知道为什么方法名称不只是 keys ?名称 Set 是否会泄露有关实现的详细信息? 据我了解,Java 是静态类型语言,名称中包
我正在尝试找出如何防止应用程序中的页面变量被全局定义。我想出了一些方法,但我想知道是否有人们使用的通用标准方法。 我使用这种方法得到了我的插件设计模式:http://www.virgentech.co
我有一个 tcp 连接,我想在服务器类的 HandleConnectionAsync 方法中保持打开状态。它将从客户端接收持续更新。 private async void HandleConnecti
这是我类(class)的一个小样本: #include #include using std::string; using std::vector; struct Book { string
我想要类似下面的代码: class Foo{ public: void update() { for( auto dataModifier : _dataModifierLis
这已经困扰我一段时间了,所以我问了一个同事他是否能理解它,现在我来了;) 为什么可以在依赖属性的 PropertyChangedCallback 中访问持有类的私有(private)成员? 让我通过这
我知道封装意味着一个对象不应该直接访问不同对象的成员……但我猜它与公共(public)领域有关?我假设公共(public)方法不会破坏封装..?我只是在这里不清楚,很高兴得到任何解释。 最佳答案
我就废话不多说了,大家还是直接看代码吧~ ? 1
我是一名优秀的程序员,十分优秀!