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文档应该描述一个给定的方法做了什么工作,而不是描述它是如何做到的

  • 相关阅读:
    webbrowser在vb中叫
    linux小记之安装bin或deb程序
    9011,9012,9013,9014,8050,8550三极管的区别
    中兴v880刷机全过程。原创亲测
    Slackware的启动(init)过程
    sysvinit
    rc.S 分析【转自CSDN 】
    linux 解压rar zip
    slackware启动脚本详解
    工作
  • 原文地址:https://www.cnblogs.com/qwop/p/6637296.html
Copyright © 2011-2022 走看看