为什么有些安卓代码有公共字段?
关于在面向对象编程中使用公共字段有很多问题和答案,其中大多数建议不要使用公共字段,原因有很多。
但是当我查看Android的代码时,我发现一些类正在使用公共字段。例如,Android.view.View
具有公共字段和 .mCachingFailed
mAttributes
为什么它们是公开的?很难认为这是谷歌和AOSP的错误。
关于在面向对象编程中使用公共字段有很多问题和答案,其中大多数建议不要使用公共字段,原因有很多。
但是当我查看Android的代码时,我发现一些类正在使用公共字段。例如,Android.view.View
具有公共字段和 .mCachingFailed
mAttributes
为什么它们是公开的?很难认为这是谷歌和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; }
}
也就是说,如果您打算让调用方对字段具有直接读写访问权限,则添加 getter 和 setter 可能只是额外的样板。
getter 和 setter 的好处是,即使它们除了读取和写入字段之外不执行其他工作,它们也会抽象出数据存储在字段中的事实。它可以存储在外部数据源中,也可以动态计算,或者任何你喜欢的东西,调用方不必担心行为是如何实现的。一般来说,这绝对是一个很好的做法,因为它将调用方关注的问题(API)与你的关注点(实现)分开。
但是,有时它只是矫枉过正,如果这是提供呼叫者所需行为的最佳方式,那么公开公共字段是完全合理的。大多数情况下,这是对值类型(仅用于将多个字段组合在一起的类)执行的。写出大量的 getter 和 setter 没有什么好处,因为你需要一个类要做的所有事情都可以通过简单地公开字段来完成。
实际上,Android还有另外一个问题。方法调用成本高昂,应用可以(轻松)定义的方法数量限制为 ~65k。对于可以安全执行此操作的情况,直接公开字段可将方法开销减少两倍,并节省宝贵的 CPU 时间。这可能看起来不是很多,但它加起来很快。
从 developer.android.com 查看此部分:
在像C++这样的母语中,通常的做法是使用getters(i = getCount())而不是直接访问字段(i = mCount)。对于C++来说,这是一个很好的习惯,并且通常在其他面向对象的语言(如C#和Java)中实践,因为编译器通常可以内联访问,并且如果需要限制或调试字段访问,您可以随时添加代码。
但是,这在Android上是一个坏主意。虚拟方法调用成本高昂,远高于实例字段查找。遵循常见的面向对象编程实践并在公共接口中使用 getter 和 setter 是合理的,但在类中,您应该始终直接访问字段。
如果没有JIT,直接现场访问比调用一个微不足道的getter快3倍。使用JIT(直接现场访问与访问本地一样便宜),直接现场访问比调用微不足道的getter快7倍。
请注意,如果您使用的是 ProGuard,则可以两全其美,因为 ProGuard 可以为您内联访问器
http://developer.android.com/training/articles/perf-tips.html#GettersSetters
最有可能的是,这就是您在AOSP中看到公共字段的原因。