昨天看了一下反模式,居然发现call super也是其中一种,所谓的call super就是在子类的重载方法中去调用父类的被重载的方法,说的通俗点,就是在方法中调用super.xxx(). 这种写法在Java中真是太普遍了,且不说Java的构造方法会自动调用父类的构造方法,我们自己也是经常在用super.xxx()。为什么它是一种反模式,却又用的如此普遍呢?
   为什么不提倡用super,Martion Flower是这么解释的:Whenever you have to remember to do something every time, that's a sign of a bad API. Instead the API should remember the housekeeping call for you. 就是说不能让子类老是记得要调用super.xxx, 你的API设计应该帮你调用。为此,他建议用template method pattern。比如:

public class EventHandler ...
  public void handle (BankingEvent e) {
    housekeeping(e);
  }
public class TransferEventHandler extends EventHandler...
  public void handle(BankingEvent e) {
    super.handle(e);
    initiateTransfer(e);
  }

可以改成:
public class EventHandler ...
  public void handle (BankingEvent e) {
    housekeeping(e);
    doHandle(e);
  }

  protected void doHandle(BankingEvent e) {
  }
public class TransferEventHandler extends EventHandler ...
  protected void doHandle(BankingEvent e) {
    initiateTransfer(e);
  }

但是用模板方法也有它的局限性,它要求改动父类代码,如果你是扩展某些API,那那些父类代码不见得能随便修改。再加上super.xx()非常直观明了,我想这也是super call仍然被广泛使用的原因吧。
posted on 2009-09-02 16:28 Aaron.Chu 阅读(225) 评论(0)  编辑  收藏

只有注册用户登录后才能发表评论。


网站导航:
 
<2009年9月>
303112345
6789101112
13141516171819
20212223242526
27282930123
45678910

留言簿(5)

随笔档案(57)

相册

友情链接

搜索

  •  

最新评论

阅读排行榜

评论排行榜