一尘不染

Android中的单例与应用程序上下文?

java android

回顾这篇文章,列举了使用单例的几个问题, 并看到了使用单例模式的Android应用程序的几个示例,我想知道使用单例而不是通过全局应用程序状态共享的单个实例(将android.os.Application子类化并获取它)是否是一个好主意。通过context.getApplication())。

两种机制都有哪些优点/缺点?

老实说,我希望在此后的Singleton模式与Web应用程序中得到相同的答案,这不是一个好主意!但适用于Android。我对么?否则DalvikVM有什么不同?

编辑:我想对涉及的几个方面有意见:

  • 同步化
  • 可重用性
  • 测试中

阅读 394

收藏
2020-02-27

共1个答案

一尘不染

我非常不同意Dianne Hackborn的回应。我们会逐步从项目中删除所有单例,以支持轻量级的,任务范围内的对象,可以在你实际需要它们时轻松地重新创建它们。

单例是测试的噩梦,如果延迟初始化,将引入“状态不确定性”,并带有微妙的副作用(当将调用getInstance()从一个作用域移到另一个作用域时可能会突然浮出水面)。已经提到了可见性是另一个问题,并且由于单例意味着对共享状态的“全局”(=随机)访问,因此当在并发应用程序中未正确同步时,可能会出现细微的错误。

我认为这是一种反模式,这是一种糟糕的面向对象风格,从本质上讲相当于维持全局状态。

回到你的问题:

尽管应用程序上下文本身可以视为单例,但它是框架管理的,并且具有明确定义的生命周期,范围和访问路径。因此,我认为,如果你确实需要管理应用程序全局状态,则应该在这里,无处可去。对于其他任何事情,请重新考虑是否确实需要单例对象,或者是否有可能重写你的单例类以实例化执行手头任务的小型短期对象。

2020-02-27