猿问

Android中的单身汉与应用上下文?

Android中的单身汉与应用上下文?

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

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

老实说,我希望在这篇文章中得到同样的答案。单例模式与Web应用程序,不是一个好主意!但适用于安卓系统。我说对了吗?否则,DalvikVM有什么不同?

编辑:我想就以下几个方面发表意见:

  • 同步
  • 可重用性
  • 测试


元芳怎么了
浏览 439回答 3
3回答

守着星空守着你

我非常不同意戴安·哈克伯恩的回答。我们一点地从我们的项目中移除所有的单点对象,以支持轻量级的、任务范围的对象,当您实际需要它们时,这些对象可以很容易地重新创建。单节点是测试的噩梦,如果初始化延迟,将引入“国家不确定性”具有微妙的副作用(当将调用转移到getInstance()从一个范围到另一个范围)。可见性被提到了另一个问题,因为单例意味着“全局”(=随机)访问共享状态时,当并发应用程序中不正确同步时,可能会出现微妙的bug。我认为这是一种反模式,这是一种糟糕的面向对象的风格,本质上相当于维护全球状态。回到你的问题上:虽然应用程序上下文可以被认为是单例,但它是由框架管理的,并且有一个很好的定义。生命周期、范围和访问路径。因此,我认为,如果你真的需要管理应用-全球状态,它应该去这里,没有其他地方。再考虑一下真的需要一个单例对象,或者也可以重写您的单例类来实例化执行手头任务的小的、短命的对象。

慕沐林林

我非常推荐单身人士。如果您有一个需要上下文的单例,请具有:MySingleton.getInstance(Context c) {     //     // ... needing to create ...     sInstance = new MySingleton(c.getApplicationContext());}我更喜欢单身汉而不是应用程序,因为它有助于保持应用程序更有组织性和模块化-而不是有一个需要维护整个应用程序的全球状态的地方,每个单独的部分都可以自己处理。另外,在Application.onCreate()中,单例延迟初始化(应请求)而不是引导您执行所有初始化的路径也是好的。使用单子没有本质上的错误。只要正确地使用它们,当它有意义的时候。Android框架实际上有很多,因为它可以维护每个进程缓存的加载资源和其他类似的东西。对于简单的应用程序,多线程不会成为单线程的问题,因为通过设计,对应用程序的所有标准回调都被分派到进程的主线程上,所以除非通过线程显式地引入多线程,或者通过将内容提供程序或服务IBinder发布到其他进程,否则不会发生多线程。想想你在做什么就行了。*)

BIG阳

来自:开发人员>参考-应用程序通常不需要子类应用程序。在大多数情况下,静态单节点可以更模块化的方式提供相同的功能。如果您的单例需要全局上下文(例如注册广播接收器),那么检索它的函数可以在第一次构造单例时在内部使用Context.getApplicationContext()。
随时随地看视频慕课网APP

相关分类

Java
Android
我要回答