Android 避免使用内部getter/setter

Android 避免使用内部getter/setter,android,mobile,Android,Mobile,在Activity.java的源代码中,我看到一些方法如下: public View findViewById(int id) { return getWindow().findViewById(id); } 以及getWindow方法的定义: public Window getWindow() { return mWindow; } 但按照以下规则: 避免内部getter/setter 母语在C++语言中 使用吸气剂的常见做法(例如 =getCount()),而不是直接访问

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

public View findViewById(int id) {
    return getWindow().findViewById(id);
}
以及getWindow方法的定义:

public Window getWindow() {
    return mWindow;
}
但按照以下规则:

避免内部getter/setter

母语在C++语言中 使用吸气剂的常见做法(例如 =getCount()),而不是直接访问字段(i=mCount)。这是 一个优秀的C++习惯,因为 编译器通常可以内联 访问,以及如果需要限制或 调试字段访问您可以添加 任何时候都可以使用密码

在Android上,这是个坏主意。 虚拟方法调用非常昂贵, 比实例字段更重要 查找。这样做是合理的 通用面向对象程序设计 练习并拥有接受者和接受者 在公共界面中,但在 类,您应该始终访问字段 直接的

在没有JIT的情况下,直接字段访问是非常困难的 比调用 琐碎的获取者。使用JIT(在哪里 直接现场访问与 访问本地(直接)字段 访问速度大约比以前快7倍 调用一个微不足道的getter。这是 在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()
,可能您正在寻找不再放在那里的东西。

我们现在有理由微笑

android文档说为了避免内部的getter和setter将很快改变,据说progruard被添加到姜饼平台,姜饼平台很好地内联了accessor,请参阅和这两篇SO文章


  • 谢谢你的回答。正如您所说,我当然会为每个视图调用findViewById一次。也许我误解了这个原则,现在很清楚了。我不需要一直调用getWindow()来评估视图成员。尽管如此,我们是安卓API的客户,我想知道他们为什么这样写代码,为什么不是这样,这是值得我关心的。谢谢你的回答,你没有完全理解我。在GigerRead中,findView可能使用存储在窗口对象中某处的信息。蜂巢谷歌可能会决定更改视图层次结构系统,并将相应的信息存储在另一个位置,使用其他数据结构的另一种格式。如果直接使用Windows,它在新版本中无法工作。如果您使用findView,google可以调用新的实现。更多信息:我的最后一个链接应该是