如同它的“表亲”- c 中的 const 关键字一样,根据上下文,final 表示不同的东西.final 关键字可应用于类.方法或字段.应用于类时,意味着该类不能再生成子类.应用于方法时,意味着该方法不能被子类覆盖.应用于字段时,意味着该字段的值在每个构造器内必须只能赋值一次而且此后该值永远不变.
为什么这个类是 final? 【程序编程相关:对黑洞的疑惑】
大多数 java 文本都适当地描述了使用 final 关键字的用法与后果,但是很少以准则的方式提供有关何时使用 final 及使用频率的内容.根据我的经验,final 非常过度地用于类与方法(通常是因为开发人员错误地相信这会提高性能),而在其用武之地 - 声明类实例变量 - 却使用不足. 【推荐阅读:一些珍藏代码奉献,绝对有价值,不可不看!】
对于开发人员来说,将类声明为 final,却不给出为何作出这一决定的说明,这样的做法很普遍,在开放源码项目中尤其如此.一段时间之后,特别是如果原来的开发人员不再参与代码的维护,其它开发人员将总是发问“为何类 x 被声明成 final?”.通常没人知道,当有人确实知道或喜欢猜测时,答案几乎总是“因为这能使它运行得更快”.普遍的理解是:将类或方法声明成 final 会使编译器更容易地内联方法调用,但是这种理解是不正确的(或者至少说是大大地言过其实了). 【扩展信息:Symbian游戏编程入门 (一) Sy】final 类与方法在编程时可能是非常大的麻烦 - 它们限制您选择重用已有的代码与扩展已有类的功能.有时有很好的理由将类声明成 final(如强制不变性),此时使用 final 的益处将大于其不便之处.性能提高几乎总是成为破坏良好的面向对象设计原则的坏理由,而当性能提高很小或者根本没有提高时,则它真正是个很差的权衡方法.
过早优化
出于性能的考虑,在项目的早期阶段将方法或类声明成 final 是个坏主意,这有多个原因.首先,早期阶段设计不是考虑循环计算性能优化的时候,尤其当此类决定可能约束您使用 final 进行设计.其次,通过将方法或类声明成 final 而获得的性能优势通常为零.而且,将复杂的有状态的类声明成 final 不利于面向对象的设计,并导致体积庞大且面面俱到的类,因为它们不能轻松地重构成更小更紧凑的类.与许多有关 java 性能的神话一样,将类或方法声明成 final 会带来更佳的性能,这一错误观念被广泛接受但极少进行检验.其论点是:将方法或类声明成 final 意味着编译器可以更加积极地内联方法调用,因为它知道在运行时这正是要调用的方法的版本.但这显然是不正确的.仅仅因为类 x 编译成 final 类 y,并不意味着同样版本的类 y 将在运行时被装入.因此编译器不能安全地内联这样的跨类方法调用,不管是不是 final.只有当方法是 private 时,编译器才能自由地内联它,在这种情况下,final 关键字是多余的.
另一方面,运行时环境与 jit 编译器拥有更多有关真正装入什么类的信息,可以比编译者作出好得多的优化决定.... 下一页