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

标签 java android design-patterns singleton

回顾 post enumerating several problems of using singletons 并且已经看过几个使用单例模式的 Android 应用程序示例,我想知道使用单例而不是通过全局应用程序状态共享的单个实例是否是一个好主意(子类化 android.os.Application 并通过 context.getApplication() 获取它)。

这两种机制有什么优点/缺点?

老实说,我希望这篇文章能得到相同的答案 Singleton pattern with Web application, Not a good idea!但适用于Android。我对么? DalvikVM 有什么不同?

编辑:我想就所涉及的几个方面发表意见:

  • 同步
  • 可重用性
  • 测试

最佳答案

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

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

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

回到你的问题:

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

关于java - Android中的单例与应用程序上下文?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3826905/

相关文章:

java - 打开/关闭给定网络的飞行模式。

android - 屏幕旋转时 Activity 重新启动

design-patterns - 何时使用 CQRS 设计模式?

javascript - 具有默认值的选项的 javascript 设计模式?

javascript - 如何实现具有属性子集的类?

java - 通过 ClipData.Item.getUri 暴露在应用程序之外

java - 资源规范不允许错误

java - 将 jtable 中的第一行保留为默认选择

android - 如何使用 Gradle 构建系统让 PhoneGap 项目在 Android Studio 中运行

c# - WaitForSeconds 逐渐变得不同步... Unity