单例模式是在Android应用程序中保持数据的最佳方式吗?

3

我正在构建一个安卓应用程序,它有一个User类,用于保存用户的个人资料信息。

当创建用户时,它会保存在一个SharedPreferences文件中,这样下次启动应用程序时就可以加载最后创建的用户。我还有一个Singleton类,它保存了新创建的用户对象,以便其他类可以使用它。

我这样做是为了避免每次更改片段并需要用户时都要读取SharedPreferences文件。

我的问题是:
使用Singleton是保持整个应用程序内存变量的正确方法吗?
它是为此而设计的吗,还是有另一种方法可以保持面向对象编程原则?
在Activity中创建带访问器方法的变量是否更好?

2个回答

2
我会使用以下内容: 接口 CurrentUser。CurrentUser 有检索和更新用户的方法。用户可以存储在数据库、偏好设置或混合中。 当需要时,我会使用 Dagger 注入 CurrentUser。由于 Dagger 不保证单例的质量,因此 CurrentUser 的实现本身应该是一个单例。 如果您的 CurrentUser 具有类似 RxJava 流或 LiveData 的功能以保持观察者的最新状态,则可以获得额外的优势分数。
作为 Singleton 的替代方案,您可能希望使用保留片段实现 Fragment Holder 模式,但在您的情况下,Singleton 似乎更好。只需确保使用界面和注入来不影响可测试性并保持组件分离。

据我所了解,本质上信息保存在单例类中,但这种方式使代码更加清晰和模块化? - D3bian0s
是的,代码更好。通过客户端获取单例实例是不好的做法,但只要客户端不自己获取它,单例生命周期就没有问题。如果单例具有状态,则可能很难进行测试,因此请考虑将构造函数设置为包私有,并在每个测试中使用单例的新实例,这样您就可以轻松进行测试了。 - charlag

1

是的,这是更好的方法。并且最好将数据(如您提到的情况)保存在单例对象中,而不是每次从共享首选项中访问。我们在应用程序中使用单例来进行会话处理,这意味着只要应用程序正在运行,变量数据就可以访问。您可以在Activity级别上创建变量,但那是非常糟糕的方法。简而言之,您正在使用的方法是最佳方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接