假设我有一个想通过静态方法提供自身实例的类。实例需要使用Context
,因此该方法将被调用如下:
Foo foo = Foo.getInstance(context);
我想这样做:
public class Foo {
private static final Map<Context, Foo> instances = new WeakHashMap<>();
private final WeakReference<Context> weakContext;
private Foo(Context context) {
if(context == null) throw new NullPointerException();
weakContext = new WeakReference<Context>(context);
}
public static Foo getInstance(Context context) {
Foo instance = instances.get(context);
if(instance == null) {
instance = new Foo(context);
instances.put(context, instance);
}
return instance;
}
}
首先,这会有效吗?第二,为什么我会感觉到我在思考它?
答案 0 :(得分:0)
您希望缓存Foo
。当我需要缓存时,我更喜欢它不在我的模型中。
也许你只需要一个工厂,你可以将Map<Context, Foo> instances
放在工厂里。
答案 1 :(得分:0)
在考虑更多之后,我说我的问题中的代码要么无意义复杂,要么需要进一步细化,具体取决于Foo
是否需要做一些无法通过应用程序完成的事情上下文。
如果确实如此,那么我的getInstance(...)
看起来与我最初写的相似,只是代替Context
它应该需要更具体的类型,例如getInstance(Activity)
。
如果它没有,那么我可以免除Map
。该实例可以是伪单例并使用应用程序上下文。
This article包含一个表格,显示您可以对不同类型的上下文执行的操作。
答案 2 :(得分:0)
您所描述的情况是如何设计Android系统服务。 根据提供的上下文,确定服务的可用性和功能。 如果您想根据上下文提供不同的功能,那么您可以查看它们的实现。
然而,要记住的重要一点是上下文也有层次结构。所以你获得一个活动上下文,你也可以获得应用程序上下文。
保持弱势上下文也可能适得其反:假设您对ActivityA
的引用较弱,但目前位于ActivityB
,您现在需要一个ActivityB
上下文。
所以通常的单身人士模式应该符合你的目的。如果您正在尝试更复杂的功能,那么提供用例可能会为您提供更有针对性的答案。