×

消息

EU e-Privacy Directive

This website uses cookies to manage authentication, navigation, and other functions. By using our website, you agree that we can place these types of cookies on your device.

View e-Privacy Directive Documents

You have declined cookies. This decision can be reversed.

接口优于抽象类

接口和抽象类是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页