Effective Java(Joshua Bloch)第17项说:
“设计和文档或继承或禁止它”
然而,只是粗略地浏览一下Android API就会发现大多数API类都是非最终的;如果它们也被记录为继承(例如View
的{{1}}),那就没问题。但是也有几个非final类,但是文档没有提到这些类的可继承性。只是一些随意的例子来说明我的观点:
Activity
,WifiManager
...)NotificationManager
这样的实用程序类。UriMatcher
。开放性和可扩展性是Android的哲学,这里的惯例是否已经逆转?意思是,可以假设Android API类的 所有 被设计为继承(无论是明确记录还是其他);除非宣布最后?
答案 0 :(得分:4)
Android开发人员竭尽全力确保可扩展性,虽然在许多情况下不推荐。这背后的动机似乎与测试环境有关。
例如,如果最终确定创建单元测试的目的,创建一个虚假WifiManager
将会困难得多。如果没有最终确定,将WifiManager
子类化(例如,在操作期间模仿“意外的”wifi断开连接)并从定制测试Context
返回此子类的实例是微不足道的。
因此,虽然您可能永远不会找到在您发送给最终用户的应用程序中实现这些类的子类的理由,但是如果由于某种原因需要,您可以灵活地扩展它们。
在实用程序类的情况下,答案很简单,通过允许开发人员子类,不会减少类的实用程序;在许多情况下,开发人员可以通过继承实现比通过聚合和委派更容易理解的代码重用。
答案 1 :(得分:4)
仅仅是我的0,02欧元:书中的清洁OO设计是一回事,让事情适用于所有在实践中可能的用例是另一回事。清洁OO设计的原则有时在某种程度上是学术性质的。 - 也许有点黑白分明。
想想谁使用谷歌提供的Android API:不仅是应用程序开发人员,还有需要的设备制造商专门为其设备提供通用API。< / p>
所以,对我来说,在大多数情况下,SW设计既不是黑色也不是白色;灰色阴影很重要。
最后:在实践中,我很少(阅读:从不)看到由“不小心”省略final
关键字(在课堂上)引起的问题,而未反复过度使用{{1} (通常由像“我的代码是 sooo [很棒]这样的想法引起的,没有人会真正希望通过继承修改它”)可能会非常痛苦
“我知道我什么都不知道”似乎适合这里:声称一个人知道所有疯狂,巧妙,有创意,聪明,......其他人的想法是很冒昧的代码可能会在未来使用。