在面向对象编程中使用公共字段有很多问题和答案,其中大多数建议不要使用公共字段,原因很多。
但是当我查看Android的代码时,我发现一些类正在使用公共字段。例如,Android.view.View
包含公开字段mCachingFailed
和mAttributes
。
为什么他们公开?很难想象这是谷歌和AOSP的错误。
答案 0 :(得分:14)
拥有公共领域本身并不是一个错误。正如赏金记录所暗示的那样,并非“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)与您的关注点(实现)分开。
然而,有时它只是矫枉过正,如果这是提供调用者所需行为的最佳方式,那么暴露公共字段是完全合理的。大多数情况下,这是针对value types完成的,这些类仅存在 以将多个字段组合在一起。当你需要上课时所做的一切都可以通过简单地将这些领域公开来完成,写出几十个吸气剂和制定者几乎没有什么好处。
实际上,Android还有一个额外的问题。方法调用很昂贵,应用程序可以(轻松)定义的方法数量为limited to ~65k。对于可以安全执行此操作的情况,直接暴露字段可将方法开销减少两倍,从而节省宝贵的CPU时间。这可能看起来不是很多,但它很快就会增加。
答案 1 :(得分:7)
从developer.android.com查看此部分:
在像C ++这样的本地语言中,使用getter是常见的做法(i = getCount())而不是直接访问该字段(i = mCount)。这个 是C ++的一个很好的习惯,并且经常在其他对象中实践 面向C#和Java的语言,因为编译器通常可以 内联访问,如果您需要限制或调试字段访问 您可以随时添加代码。
然而,这在Android上是一个坏主意。虚方法调用是 比实例字段查找昂贵得多。这很合理 遵循常见的面向对象编程实践并拥有 公共界面中的getter和setter,但是在一个类中 应始终直接访问字段。
没有JIT,直接字段访问速度比调用a快3倍 琐碎的吸气剂。使用JIT(直接现场访问便宜) 访问本地),直接字段访问速度比快7倍 引用一个微不足道的吸气剂。
请注意,如果您使用的是ProGuard,则可以充分利用它们 世界,因为ProGuard可以为您内联访问者
http://developer.android.com/training/articles/perf-tips.html#GettersSetters
最有可能的是,这就是您在AOSP中看到公共字段的原因。