2011-01-28 88 views
1

由于ActivityThread类的源显示,它是一个final类,并且此类中的所有方法也是final方法。由于在java中的关键字定义为final,这个类不能被继承,但为什么android开发人员保留这些方法final有关ActivityThread中使用的final关键字的疑惑

也许我没有明确表达这个问题,我在这里修复它。

ActivityThread是final类,它不会有任何的子类,并没有方法将被覆盖,但你知道,在这个类是final所有的方法,我想知道他们为什么需要这些final关键字,他们可以将其删除而不会造成影响。

回答

2

Java Language Specification清楚地表明,没有一个final类的方法可以被重写。因此,该方法的声明似乎是多余的。 (当ActivityThread可能不是最后一类时,可能从Android API的测试版中遗留下来了)

另一方面,优化器和混淆器有时可以用方法final做更多一点。虽然他们应该有足够的智慧来推断最终阶级不会有任何重叠的方法,但给他们额外的提示并不会带来什么伤害。

1

为什么android开发人员保持这些方法最终?

实际上,Java工程师是这样做的。这是一个设计决定:有时候你想禁止对你的一个类进行子分类。为什么?其中一些原因是它意味着一些强大的责任,这迫使你做出非常聪明的决定。

让我约书亚布洛赫引用该项目数的17 Effective Java Second Edition部分:

那么这是什么意思对于要设计一个类和记录继承? 首先,该类必须准确记录覆盖任何方法的效果。换句话说,班级必须记录自己使用的可重写方法。对于每个公共或受保护的方法或构造函数,文档必须指明方法或构造函数调用哪些可覆盖的方法,以何种顺序以及每次调用的结果如何影响后续处理。 (通过覆盖,我们的意思是非正式的,不论是公共的还是受保护的。)更一般地说,一个类必须记录任何可能调用可重写方法的情况。例如,调用可能来自后台线程或静态初始化程序。

...

继承设计涉及的不仅仅是记录自我使用模式。为了让程序员能够写出有效的子类而不会带来过度的痛苦,一个类可能必须以恰当选择的受保护方法的形式提供内部工作,或者在极少情况下提供受保护的字段。

+0

但我认为没有必要为ActivityThread的方法保留这些最终关键字。班级的最后一部分完成了禁止自己及其方法被继承或覆盖的工作。 – teok 2011-01-28 05:09:44