zoukankan      html  css  js  c++  java
  • EffectiveJava(17)要么为继承而设计,要么禁止继承

    1.如果为了继承而设计类,那么该类必须有文档说明它可覆盖的方法的自用性.对于每个公有的
    或受保护的方法或者构造器,它的文档必须指明该方法或者构造器调用了那些可覆盖的方法,是以
    什么顺序调用的,每个调用的结果又是如何影响后续的处理过程的
    –类必须通过某种形式提供适当的钩子,以便能够进入到它的内部工作流程中,这种形式可以是
    精心选择的受保护的方法,也可以是受保护的域
    –尽可能的减少暴露的成员
    –对于为了继承而设计的类,唯一的测试方法就是编写子类
    –构造器绝不能调用可被覆盖的方法,无论直接还是间接:超类的构造器在子类的构造器之前运行,所以
    –子类中覆盖版本的方法依赖于子类构造器所执行的任何初始化工作
    /**
    * 构造器Sub没有机会初始化域date
    * @author JacXuan
    *
    */
    public class Sub extends Super{
    private final Date date;
    Sub(){
    date = new Date();
    }

    public void ovrrideMe(){
        //如果ovrrideMe已经调用了date中的任何方法,当super构造器调用了ovrrideMe
        //的时候,调用就会抛出NullPointException方法
        System.out.println(date);
    }
    
    public static void main(String[] args) {
        Sub sub = new Sub();
        sub.ovrrideMe();
    }
    

    }

    public class Super {
    public Super(){
    //如果ovrrideMe已经调用了date中的任何方法,当super构造器调用了ovrrideMe
    //的时候,调用就会抛出NullPointException方法
    ovrrideMe();
    }
    public void ovrrideMe(){

    }
    

    }

    无论是clone还是readObject,都不可以调用可覆盖的方法:因为二者在行为上非常类似构造器
    对于那些并非为了安全地进行子类化而设计和编写文档的类,要禁止子类化
    2.程序文档:好的API文档应该描述一个给定的方法做了什么工作,而不是描述它是如何做到的

  • 相关阅读:
    python总结4
    python中if __name__ == '__main__': 的解析
    matlab学习1
    phpstorm xdebug环境搭建
    uniapp 直播跳转小程序组件
    vue中异步函数async和await的用法
    TFS 2010安装配置(Advance)失败记录
    WIN2003 SMTP Service issue
    WIN2003 ftp server权限设置
    Discuz 7.2 SC UTF8设置
  • 原文地址:https://www.cnblogs.com/qwop/p/6637296.html
Copyright © 2011-2022 走看看