msc*_*ker 360 java singleton android design-patterns
回顾这篇文章列举了使用单例的几个问题 并看过使用单例模式的Android应用程序的几个例子,我想知道使用Singletons而不是通过全局应用程序状态共享的单个实例是一个好主意(继承android.os.Application并获取它通过context.getApplication()).
两种机制都有哪些优点/缺点?
说实话,我希望在这篇文章中使用Web应用程序的单例模式得到相同的答案,不是一个好主意!但适用于Android.我对么?DalvikVM有什么不同呢?
编辑:我想对涉及的几个方面有意见:
Mat*_*ias 294
我非常不同意Dianne Hackborn的回应.我们一点一点地从项目中删除所有单例,转而使用轻量级的任务范围对象,这些对象在您实际需要时可以轻松地重新创建.
单身人士是一个测试的噩梦,如果懒洋洋地初始化,将引入"状态不确定性",带有微妙的副作用(当将呼叫getInstance()
从一个范围转移到另一个范围时可能突然出现).可见性已被提及为另一个问题,并且由于单例意味着对共享状态的"全局"(=随机)访问,因此在并发应用程序中未正确同步时可能会出现细微的错误.
我认为它是一种反模式,它是一种糟糕的面向对象的风格,基本上相当于维持全球状态.
回到你的问题:
尽管应用程序上下文本身可以被视为单例,但它是框架管理的,并且具有明确定义的生命周期,范围和访问路径.因此,我相信如果你确实需要管理应用程序全局状态,它应该在这里,其他地方.对于其他任何事情,重新考虑如果你真的需要一个单例对象,或者如果还可以重写你的单例类而不是实例化执行手头任务的小的,短期的对象.
hac*_*bod 229
我非常推荐单身人士.如果您有需要上下文的单例,请:
MySingleton.getInstance(Context c) {
//
// ... needing to create ...
sInstance = new MySingleton(c.getApplicationContext());
}
Run Code Online (Sandbox Code Playgroud)
我更喜欢单身人士而不是应用程序,因为它有助于保持应用程序更有条理和更模块化 - 而不是让一个地方需要维护整个应用程序中的所有全局状态,每个单独的部分都可以自行处理.事实上,单身人士懒惰地初始化(在请求时)而不是引导你在Application.onCreate()中完成所有初始化的路径是好的.
使用单身人士并没有什么本质上的错误.只要有意义,请正确使用它们.Android框架实际上有很多,因为它可以维护已加载资源和其他此类事物的每个进程缓存.
同样对于简单的应用程序,多线程不会成为单例的问题,因为通过设计,应用程序的所有标准回调都会在进程的主线程上调度,因此除非您通过线程明确地引入多线程,否则不会发生多线程隐式地通过将内容提供者或服务IBinder发布到其他进程.
只是要考虑你在做什么.:)
Som*_*tik 20
通常不需要子类Application.在大多数情况下,静态单例可以以更模块化的方式提供相同的功能.如果你的单例需要一个全局上下文(例如注册广播接收器),那么检索它的函数可以给一个Context,它在第一次构造单例时在内部使用Context.getApplicationContext().
Jos*_*éMi 11
我遇到了同样的问题:Singleton还是做了一个子类android.os.Application?
首先我尝试使用Singleton但我的应用程序在某个时候调用了浏览器
Intent myIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.google.com"));
Run Code Online (Sandbox Code Playgroud)
问题是,如果手机没有足够的内存,大多数类(甚至单身人士)都会被清理以获得一些内存,因此,当从浏览器返回到我的应用程序时,它每次都会崩溃.
解决方案:将所需数据放入Application类的子类中.
sun*_*ang 10
申请与Singleton不同.原因是:
同时考虑两者:
此外,我建议您扩展Context以不仅包括对单例对象的访问,还包括需要全局访问的一些功能,例如:context.logOffUser(),context.readSavedData()等.可能将Context重命名为门面就有意义了.
归档时间: |
|
查看次数: |
134531 次 |
最近记录: |