所有活动都需要相同数据时的单例替代

时间:2018-12-04 13:17:49

标签: java android

如我所读,单例很糟糕,应该避免使用它们。

但是我开发了一个应用程序,其中大多数活动和片段都需要访问同一数据集。数据存储在ArrayList中,并且可以通过singleton类进行访问。

这有什么不好?我无法为每个活动创建一个新的数据类对象,因为ArrayLists将有所不同。有什么选择?

2 个答案:

答案 0 :(得分:1)

  

单件不好,应该避免使用它们

在Android应用程序开发中,与传统的Java开发相比,我们使用单例的次数要多得多。

恕我直言,关键是:

  • 请小心使用它们,确保不会引入内存泄漏,竞争状况等。

  • 将它们用于特定角色,例如遵循存储库模式,而不是仅仅对所有内容使用static,因为您希望使编译器停止对您说卑鄙的话

  • 使用 LiveData,RxJava,Kotlin协程等),假设单例管理的数据来自涉及I / O(网络)的事物,数据库,文件等)

  

这有什么不好?

可能什么也没有。您的具体实现可能会有问题,但是我们对此的详细信息很少。

答案 1 :(得分:1)

字母本身还不错,的问题是当您开始尝试测试代码时。

当您拥有一个或多个依赖于一个或多个单例的类/模块/组件/视图时,您将无法控制该依赖关系,因此在测试环境中,您无法“模拟”该单例依赖关系或控制数据在其中它们(您可以,但是确实很烦人,必须在每次测试之前清除所有单例,即使这样很容易出错)。

这可以使用依赖注入轻松解决。在Android中,最好的框架是Dagger:https://google.github.io/dagger/ 您也可以始终手动使用依赖项注入,但是拥有一个可以为您完成辛苦工作的框架会很好。

然后,使用这种方法,您将一直保持单例,但它们并不是真正的单例,因为它们仅负责创建单个实例,而您(或框架)负责。这些类仅创建一次(在开始或延迟时),然后注入依赖于它们的组件/类别中。 这样,您就可以保持其所有功能(在活动,片段等之间共享数据),但是在注入它们时,可以将它们模拟为注入模拟,以进行测试。