2

让我们以自定义或扩展视图为例。

Context将构造函数的参数保存为字段是否比到处调用更有效getContext()(假设有 10 个或更多需要它的地方)?

4

3 回答 3

4

与其在每个地方都使用 getContext() ,不如在你想使用的构造函数中将当前上下文作为参数传递。

于 2012-04-24T17:03:20.080 回答
1

从源代码来看,View 的构造函数存储了上下文参数,这就是 getContext() 返回的内容:

http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.2_r1.1/android/view/View.java#View.getContext%28%29

所以,我的直觉是自己存储参数是多余的,因为超类已经为你做了。

于 2012-04-24T17:27:07.480 回答
1

View#getContext()

class View {
    protected Context mContext;
    public final Context getContext() {
        return mContext;
    }
}

和本地缓存的实现:

class X {
    private final Context mLocalContext;
    public X(Context ctx) {
        mLocalContext = ctx;
    }
}

现在,当您使用mLocalContext而不是getContext(). JVM 无需执行该方法即可获得所需的上下文对象引用(这需要一点额外的时间)。该调用无法优化,因为View#mContext它是可变的(可以更改)。在本地示例中,它可以假设mLocalContext不能更好地更改和优化代码。[注意:我不是 100% 确定可以进行哪些优化]

如果您经常使用上下文,则差异可能是可测量的,但在这种情况下,这并不重要。如果您经常需要对象,在本地缓存它们仍然是一个好主意。特别是当他们的(重新)建设需要时间时(例如,什么时候getContext()会创建一个new Context()左右)。

于 2012-04-24T17:28:13.880 回答