使用final的注意事项

设计一个类时,往往需要考虑是否将一个方法设为final。可能会觉得使用自己的类时执行效率非常重要,没有人想覆盖自己的方法。这种想法在某些时候是正确的。

但要慎重作出自己的假定。通常,我们很难预测一个类以后会以什么样的形式再生或重复利用。常规用途的类尤其如此。若将一个方法定义成final,就可能杜绝了在其他程序员的项目中对自己的类进行继承的途径,因为我们根本没有想到它会象那样使用。

标准Java库是阐述这一观点的最好例子。其中特别常用的一个类是Vector。如果我们考虑代码的执行效率,就会发现只有不把任何方法设为final,才能使其发挥更大的作用。我们很容易就会想到自己应继承和覆盖如此有用的一个类,但它的设计者却否定了我们的想法。但我们至少可以用两个理由来反驳他们。首先,Stack(堆栈)是从Vector继承来的,亦即Stack“是”一个Vector,这种说法是不确切的。其次,对于Vector许多重要的方法,如addElement()以及elementAt()等,它们都变成了synchronized(同步的)。正如在第14章要讲到的那样,这会造成显著的性能开销,可能会把final提供的性能改善抵销得一干二净。因此,程序员不得不猜测到底应该在哪里进行优化。在标准库里居然采用了如此笨拙的设计,真不敢想象会在程序员里引发什么样的情绪。

另一个值得注意的是Hashtable(散列表),它是另一个重要的标准类。该类没有采用任何final方法。正如我们在本书其他地方提到的那样,显然一些类的设计人员与其他设计人员有着全然不同的素质(注意比较Hashtable极短的方法名与Vecor的方法名)。对类库的用户来说,这显然是不应该如此轻易就能看出的。一个产品的设计变得不一致后,会加大用户的工作量。这也从另一个侧面强调了代码设计与检查时需要很强的责任心。

时间: 2024-11-10 07:03:30

使用final的注意事项的相关文章

servlet 文件下载及注意事项

servlet|下载     首先转贴注意事项: 在论坛里,已经有先进说明过如何在 Servlet / JSP 中,利用 HTTP Protocol 实作动态的档案下载服务.这一项功能个人在系统开发中,用的很多,也遇到过几个问题,想将这些经验分享给大家,希望对大家能有帮助. 1. MS IE 版本的问题   if (request.getHeader("User-Agent").indexOf("MSIE 5.5") != -1) {     // MS IE5.5

This Handler class should be static or leaks might occur,Handler和Context使用的注意事项!

Android中,在使用到Handler的时候,如果按如下代码编写: private Handler handler; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); handler = new Handler() { @Override public void handleMessage(Message msg) { // TODO Auto-gene

ListView嵌套GridView使用详解及注意事项_Android

MainActivity如下: 复制代码 代码如下: package cn.testlistviewandgridview; import java.util.ArrayList; import java.util.HashMap; import android.app.Activity; import android.os.Bundle; import android.widget.ListView; /** * Demo描述: * ListView嵌套GridView使用详解 * 即List

ListView嵌套GridView使用详解及注意事项

MainActivity如下: 复制代码 代码如下: package cn.testlistviewandgridview; import java.util.ArrayList; import java.util.HashMap; import android.app.Activity; import android.os.Bundle; import android.widget.ListView; /** * Demo描述: * ListView嵌套GridView使用详解 * 即List

Android TimerTask 的简单应用及注意事项

Android  TimerTask 的简单应用及注意事项 Android应用开发中常常会用到定时器,不可避免的需要用到 TimerTask 定时器任务这个类 下面简单的一个示例演示了如何使用TimerTask 这个示例演示了3秒未有触屏事件发生则锁屏(只是设置下文本,意思一下)有触屏事件则解除锁定 public class ColTimerTaskActivity extends Activity { /** Called when the activity is first created.

php中$this、static、final、const、self的用法

  本篇文章主要分项了一下关于php类中的$this,static,final,const,self这几个关键字使用方法. $this $this表示当前实例,在类的内部方法访问未声明为const及static的属性时,使用$this->value='phpernote';的形式.常见用法如: $this->属性 $this->方法 举例如下:  代码如下   <?php class MyClass{  private $name;  public  function __cons

安装win7系统后需要注意的三大事项

  安装win7系统后需要注意的三大事项 1.禁止休眠 休眠过程中会导致网络也会跟着断开,而且还会占用系统盘的空间,关闭的话还可以提高运行速度的,何乐而不为呢? 2.删除旧系统备份文件 在win7系统安装完毕之后,默认情况下是会自动生成系统备份的,但是因为系统备份所占据的内存空间比较大,所以建议大家删除.在后期如果遇到问题,可以选择启动系统还原功能即可修复了. 3.虚拟内存的设置 在安装完成之后为了能够有效的提升运行速度,建议用户可以转移内置的虚拟内存,如果win7系统用户自带的内存空间较大的话

Java中利用final关键字inline编译优化真的有效吗?

(inkfish原创,转载请注明出处:http://blog.csdn.net/inkfish/) 为寻求java代码的性能优化,从网上搜到利用final关键字进行编译时inline优化的方法,但是真的有效吗?实际测试中发现未必,甚至性能影响巨大,最终放弃了使用final优化的想法. 测试环境:Windows XP SP2,JDK 1.6.0_15-b03,Eclipse 3.5 SR1.   package test; public class Test { public static voi

并行安装Visual Studio系统的注意事项分析

有时候出于系统兼容性的需要,开发人员可能会在操作系统上安装Visual的各个版本.如 Visual2008与2005.为什么开发人员会有这么需要呢?如原先开发人员在2005环境下开发了一个 ERP系统.现在开发人员觉得2008这个开发平台比较适合自己,就需要将这个软件移植到2008的 开发环境下.由于不同的版本在功能上会有所差异,为此就需要同时使用两个不同版本的开发 环境,以便于测试系统的兼容性.此时就需要在同一台计算机上同时部署多个版本的开发环境 .利用专业的术语就是说,Visual的并行安装