避免内部吸收者/安装者

在Activity.java的源代码中,我看到了一些方法:

public View findViewById(int id) {
    return getWindow().findViewById(id);
}

和getWindow方法的定义:

public Window getWindow() {
    return mWindow;
}

但是按照以下规则:

避免内部吸收者/安装者

在像C ++这样的本地语言中,通常使用getter(例如i = getCount())而不是直接访问字段(i = mCount)。 对于C ++来说,这是一个很好的习惯,因为编译器通常可以内联访问,如果需要限制或调试字段访问,则可以随时添加代码。

在Android上,这是一个坏主意。 虚拟方法调用比实例字段查找更昂贵。 遵循常见的面向对象的编程实践是合理的,并且在公共接口中有getter和setter,但在一个类中,您应该总是直接访问字段。

没有JIT,直接字段访问比调用一个简单的getter快3倍。 使用JIT(直接字段访问与访问本地一样便宜),直接字段访问比调用一个简单的getter快7倍。 Froyo确实如此,但在JIT内嵌getter方法时将来会有所改进。

所以我想知道为什么android开发人员不直接访问这个mWindow对象? 如果当前android版本的JIT不能内联访问,getWindow()。findViewById(id)将花费比mWindow.findViewById(id)更多的时间,而findViewById是一个相当常用的方法。


你不能直接访问mWindow属性 - 它是私有的。 而且我不关心findViewById的速度,因为您只需在onCreate()方法中为布局中的每个视图调用一次,并将视图存储在活动成员中。 每个视图只能调用一次findViewById,不是吗? ;-)

然而,如果你真的关心这些事情,你可以为自己调用getWindow() ,将它存储到一个局部变量中,并直接调用findViewById 。 我不会推荐这样做,因为这里所有的性能提升都不值得花时间,反正将会被JIT的未来版本淘汰。

如果你这样做,我会对你保存的微秒数量感兴趣。 :-)


首先:你不能访问它,因为它是私人的。

为什么是私人的?

如你所说,直接访问会员更快。 另一方面,您调用的方法不是非常快,因为它将查找视图层次结构中的某个视图。 因此,使用一种方法而不是直接访问会导致执行该任务所花费的总时间的百分比很小。

无论如何,我相信这是封装的原因。

您正在调用您不拥有的东西(即Android SDK)。 所以,你不应该对“在另一边”发生的事情做任何假设。 只需使用此方法,并期望它将返回所需的视图(如果不存在,则返回null)。

也许下一个版本的android将使用不同的方法来查找视图,而不是调用getWindow() 。 如果你使用这种方法,他们(Google / Android)可以简单地将该方法标记为已弃用,并将你的调用“转发”到最新的实现。 如果你直接调用getWindow() ,也许你会寻找不再放在那里的东西。


我们现在有理由微笑...

为避免内部获取者和setter的android文档将很快发生变化,据说progroard被添加到了Gingerbread平台,该平台做了一个很好的内联访问器的工作,请参阅“避免内部Getters / Setter”是不好的建议和这两个SO帖子。

  • https://stackoverflow.com/a/6716573/892055

  • https://stackoverflow.com/a/4930538/892055

  • 链接地址: http://www.djcxy.com/p/4049.html

    上一篇: Avoid Internal Getters/Setters

    下一篇: Reason to use more cookies than just a session hash for authentication?