给我的类一个静态getInstance(Context)

时间:2015-04-25 04:04:45

标签: java android weak-references

假设我有一个想通过静态方法提供自身实例的类。实例需要使用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;
    }
}

首先,这会有效吗?第二,为什么我会感觉到我在思考它?

3 个答案:

答案 0 :(得分:0)

您希望缓存Foo。当我需要缓存时,我更喜欢它不在我的模型中。

也许你只需要一个工厂,你可以将Map<Context, Foo> instances放在工厂里。

答案 1 :(得分:0)

在考虑更多之后,我说我的问题中的代码要么无意义复杂,要么需要进一步细化,具体取决于Foo是否需要做一些无法通过应用程序完成的事情上下文。

如果确实如此,那么我的getInstance(...)看起来与我最初写的相似,只是代替Context它应该需要更具体的类型,例如getInstance(Activity)

如果它没有,那么我可以免除Map。该实例可以是伪单例并使用应用程序上下文。

This article包含一个表格,显示您可以对不同类型的上下文执行的操作。

答案 2 :(得分:0)

您所描述的情况是如何设计Android系统服务。 根据提供的上下文,确定服务的可用性和功能。 如果您想根据上下文提供不同的功能,那么您可以查看它们的实现。

然而,要记住的重要一点是上下文也有层次结构。所以你获得一个活动上下文,你也可以获得应用程序上下文。

保持弱势上下文也可能适得其反:

假设您对ActivityA的引用较弱,但目前位于ActivityB,您现在需要一个ActivityB上下文。 所以通常的单身人士模式应该符合你的目的。如果您正在尝试更复杂的功能,那么提供用例可能会为您提供更有针对性的答案。