Item 17: Design and document for inheritance or else prohibit it

如果要继承,就要设计和写文档,否则禁止继承。

  • 好的API文档应该打桩一个给定的方法做了什么工作,而不是描述它是如何做到的。

  • 构造器决不能调用可被覆盖的方法,无论是直接调用还是间接调用。这是因为超类的构造器在子类的构造器之前运行,所以,子类中覆盖版本的方法将会在子类的构造器运行之前就先被调用。

//superclass
public class Divide {

    List result = new ArrayList<>();

    public Divide(){
        printSth();
    }
   protected void printSth(){
        System.out.println("asd");
    }
}
//subclass
public class Inheritance extends Divide {
    @Override
    protected void printSth() {
        super.printSth();
        System.out.println("zxc");
    }

    public static void main(String args[]) {
        Inheritance divide = new Inheritance();
//        divide.printSth();
    }
}

对于这种情况,执行subclass的main方法会打印:
asd
zxc
注意这里main方法中只是new了一个子类实例(相当于执行子类构造函数),执行顺序是:父类构造函数--》子类构造函数。

  • 对于那些并非为了安全地进行子类化而设计和编写文档的类,要禁止子类化。有两种办法可以禁止子类化:第一,把这个类声名为final。第二、把所有的构造器都声名为private,或者包级私有并增加一些静态工厂来替代构造器。

see also:
http://blog.csdn.net/u014723123/article/details/36174769

你可能感兴趣的:(Item 17: Design and document for inheritance or else prohibit it)