反模式 - Call Super

反模式 - Call Super
   昨天看了一下反模式,居然发现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仍然被广泛使用的原因吧。

你可能感兴趣的:(反模式 - Call Super)