为什么一些android代码有公共字段?

在面向对象编程中使用公有字段有许多问题和答案,其中大多数build议不要使用公有字段。

但是当我看着Android的代码,我发现一些类正在使用公共字段。 例如Android.view.View具有公共字段mCachingFailedmAttributes

他们为什么是公开的? 很难想象这对Google和AOSP来说是一个错误。

拥有公共领域本身并不是一个错误。 正如赏金笔记所暗示的那样,这不是“OOP-基本违规”。 毕竟,这两个类(大多数情况下)是相同的:

 public class DemoA { public int field; } public class DemoB { private int field; public int getField() { return field; } public void setField(int value) { field = value; } } 

也就是说,如果你打算打电话的人可以直接读写一个字段来增加一个吸气器,那么setter可能就是额外的锅炉板。

吸收者和制定者的好处,即使他们除了读写字段之外没有任何其他的工作,他们抽象的是数据存储在一个领域的事实。 它可以存储在外部数据源中,或者随时计算,或者任何你想要的,并且呼叫者不必担心行为如何实现。 这绝对是一个很好的做法因为它将调用者的问题(API)与您的担心(实施)分开。

然而,有时这只是矫枉过正,如果这是提供您的呼叫者所需行为的最佳方式,公开字段是完全合理的。 大多数情况下,这是针对值types完成的,这些类存在将多个字段组合在一起的类。 当你需要一个类来做的事情可以通过公开的方式来完成的时候,写出几十个getter和setter是没有什么好处的。

实际上,Android还有一个额外的问题。 方法调用很昂贵,一个应用程序可以(很容易)定义的方法数量限制在65k左右 。 对于安全的情况,直接暴露字段会将方法开销减less2,并节省宝贵的CPU时间。 这可能看起来不是很多,但它快速加起来。

从developer.android.com看看这个部分:

在像C ++这样的本地语言中,通常使用getters(i = getCount())而不是直接访问字段(i = mCount)。 对于C ++来说,这是一个很好的习惯,而且通常在C#和Java等其他面向对象的语言中实践,因为编译器通常可以内联访问,如果需要限制或debugging字段访问,则可以随时添加代码。

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

没有JIT,直接字段访问比调用一个简单的getter快3倍。 使用JIT(直接字段访问与访问本地一样便宜),直接字段访问比调用一个简单的getter快7倍。

请注意,如果您使用的是ProGuard,则可以拥有两全其美的function,因为ProGuard可以为您提供内联存取

http://developer.android.com/training/articles/perf-tips.html#GettersSetters

很可能,这就是您在AOSP中看到公共领域的原因。