【发布时间】:2010-09-24 19:25:00
【问题描述】:
我正在用 Java 为 Android 构建一个单例服务:
final class MyService {
private static Context context = null;
// ...
private MyService() {
myObj = new MyObj(context);
// ...
}
private static class Singleton {
private static final MyService INSTANCE = new MyService();
}
/**
* a singleton - do not use new(), use getInstance().
*/
static synchronized myService getInstance(Context c) {
if (context == null) context = c;
return Singleton.INSTANCE;
}
为了提高性能,我始终使用静态变量和方法。
我的问题:
对于对象,new() 确保 初始化该对象的机会 在使用之前。有没有 相当于静态类?为了 示例:当静态方法依赖时 在较早的初始化时-例如 至于上面的“上下文” - 有吗 一种确保 初始化首先发生?我必须吗 如果没有就抛出异常?
因为这都是静态的,我希望 只有类本身:是 根据定义,这是一个单身人士?是 上面推荐的代码只是 防止实例化的方法 对象?
提前致谢!
【问题讨论】:
-
android中的所有服务都是单例的,你想完成什么?
-
我建议不要让你的单例有状态(添加上下文)。这两件事是两个严重冲突的反模式。
-
@Falmarri:我正在努力实现 1)确保某些方法的单一权威来源,2)最大化性能。我想这类似于 getSystemService() 但在单个进程中(因此不需要 AIDL)。到目前为止,我的方法是扩展 Service,然后直接从其他应用程序组件中调用它的方法(不使用意图)。
-
@Mark:我的服务跟踪事件并通过 getter 提供摘要。这显然是有状态的,并且似乎也是单例的可行候选者。这是一个例外 - 或者你能建议我在哪里可以了解更多关于反模式的信息吗?谢谢!
-
@Falmarri:我需要添加 .. 我的服务通过警报定期运行以收集事件数据并进行汇总。该数据需要随时可用——例如当一个小部件读取它时。我已经在内存中“永久”地为小部件提供服务,但我突然想到我应该将这些解耦:定期运行的服务将摘要数据写入内容提供者,然后由调用者读取。 /me 感到很困惑 :)
标签: java android static singleton