正如ActivityThread类的源代码所示,它是一个final
类,此类中的所有方法也是final
方法。作为java中的final
关键字定义,这个类不能被继承,但为什么android开发人员保留这些方法final
?
也许我没有明确表达这个问题,我在这里解决了。
ActivityThread是一个final
类,它没有任何子类,也不会覆盖任何方法,但是你知道这个类中的所有方法都是final
,我想知道为什么他们需要这些final
个关键字,他们可以删除它们而不会产生任何影响。
答案 0 :(得分:2)
Java Language Specification清楚地表明,不能覆盖final
类的任何方法。因此,方法上的final
声明似乎是多余的。 (当ActivityThread可能不是最终类时,可能会遗留在Android API的测试版中?)
另一方面,优化器和混淆器有时可以使用声明为final
的方法做更多的事情。尽管他们应该足够聪明,以便推断出最后一堂课不会有任何被覆盖的方法,但给予他们额外的提示是不会有害的。
答案 1 :(得分:1)
为什么Android开发人员会将这些方法保持最终?
实际上,Java工程师就这样做了。这是一个设计决定:有时你想禁止对你的一个类进行子类化。为什么?其中一些原因是它意味着一些强有力的责任,迫使你做出非常明智的决定。
让我通过 Joshua Bloch 参考Effective Java Second Edition的第17项的部分内容:
那么为继承设计和记录类意味着什么呢? 首先,该类必须准确记录覆盖任何方法的影响。换句话说,该类必须记录其可重写方法的自用。对于每个公共或受保护的方法或构造函数,文档必须指出方法或构造函数调用哪些可覆盖的方法,按什么顺序,以及每个调用的结果如何影响后续处理。 (通过覆盖,我们指的是非最终的,无论是公共的还是受保护的。)更一般地说,类必须记录它可能调用可覆盖方法的任何情况。例如,调用可能来自后台线程或静态初始化程序。
...
继承设计不仅仅是记录自用模式。为了允许程序员编写有效的子类而不会造成过度痛苦,类可能必须以司法选择的受保护方法或在极少数情况下保护字段的形式为其内部工作提供挂钩。