接口优于抽象类

接口和抽象类是Java语言中的两种多态实现机制。两者最明显的区别在于:抽象类允许其本身直接实现某些方法,而接口则必须保证所有方法都是抽象的。一个更重要的区别是抽象类的使用依赖于特定的继承链结构,而接口则没有这种限制,由于Java不允许多继承,抽象类的这一特点严重限制了它们的使用。

已有类可以很容易被改造为新接口的实现,只需声明实现某接口,并添加所需方法即可。比如当Comparable接口被引入时,大量的已有Java标准类被改造为它的实现。对于抽象类,则没有这样的便利。这是因为,想把两个已有类定义为同一个新抽象类的子类,必须把这个抽象类放在两条继承链的交点位置以上,这需要对两条继承链中间部分的所有类做出同样的改造:继承新抽象类,提供抽象方法的实现。很明显,这样做开销巨大,而且很可能破坏继承逻辑。

我这人对使用的所有电脑系统都有洁癖,不能容忍莫名其妙的自动任务。前两天迁移服务器,遇到一个小问题,就属于这类。

装完系统,配置好web服务和awstats统计工具以后,系统经常提示收到内部邮件。用mail命令打开,发现是awstats自动更新时发出的。这个就很诡异,我还没建立cron条目来更新统计信息呢,而且貌似这个默认的更新间隔只有10分钟,对于我网站那一点点微不足道的流量来说,这个间隔无疑是太短了。可是通过crontab命令查询,发现不管是我自己的账户还是root,都没有定义任何cron任务,于是google了一下,找到答案。

原来,在awstats安装时,默认在/etc/cron.d目录下生成了一个名为awstats的文件,其内容是:

原来的服务器需要下线做性能维护,所以用家里的旧配件拼出一台机器,暂时顶上几天。其实这套老配置的性能比原来的服务器还强很多:

处理器:Core2 Duo e8400
内存:4G DDR2
显卡:ATI HD4670

之所以不继续用这套配置,是耗电太多的原因。这台机器功耗100瓦左右,所以全年电费大概就是100欧元,是原来atom系统的三倍以上。所以还是把原来的系统更新优化一下,让它继续发挥余热比较划算。

为了在新机器上把所有网站都搭起来,前后花了好几天的功夫。

第一步是装系统。这个很简单,usb安装debian wheezy,十几分钟的事情。

类要么被设计成专用于继承(并辅以清楚的文档),要么就完全禁止继承

item 16提到过,继承一个本软件包以外的类是危险的,除非它被设计成专用于继承。这节就是讲一个"专用于继承的类"该是什么样子。

首先,这个类必须用文档注明它自己对"可覆盖方法"的使用情况(所谓"可覆盖方法",就是非final的、并且是public或protected的方法)。比如:某个方法调用了哪些可覆盖方法,调用顺序怎样,它们的返回值对后续处理将产生怎样的影响。还应注明在哪些情况下,可覆盖方法会被调用。比如调用者可能是后台运行的其他线程或静态初始化代码。

相对于继承(inheritance),应更优先使用组合(composition)

继承是一种非常强大的代码重用方式,但它并不总是最好的方式。

在同一个软件包内可以安全地使用继承,这是因为父类和子类都在同一群开发者的维护之下。或者父类是被设计为专用于继承,那么同样可以安全地使用。相反,跨软件包去继承普通的类,则可能是危险的。

不同于方法调用,继承会破坏类的封装。换言之,子类必须依赖于父类的实现细节才能正常运行,而父类的实现完全可能在不同版本之间发生变化,这会破坏子类代码。

比如下面的代码。继承了HashSet类,增加一个计数器,以统计Set中曾加入过的元素总数:

这个博客已经建立两年多,但真正开始写是最近一个多月。之前一直没有遇到性能问题,想必是因为数据量小,只有个位数的文章,所有访问都是飞快。

现在文章即将过百,访问明显变慢了。前不久有国内的朋友抱怨访问速度太慢,查了一下发现,国内的问题应该是dns、路由和墙共同作用的结果。在http://ping.chinaz.com/测速得到:

线路耗时最短节点耗时最长节点平均耗时
所有线路 英国[海外] 深圳[联通] 3528毫秒
电信 四川遂宁[电信] 江西[电信] 3846毫秒
多线 浙江[多线] 安徽[多线] 3437毫秒
联通 安徽滁州[联通] 深圳[联通] 4832毫秒
移动 山东[移动] 深圳[移动] 3222毫秒
海外 英国[海外] 日本[海外] 2307毫秒

第3页 共10页