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

  • 相关阅读:
    DownloadManager
    Android(蓝牙)
    Android下集成Paypal支付
    java 网络(socket)
    java 泛型的几点备忘
    设计模式(模板方法)
    STM32F4_引领入门
    如何查找STM32开发资料
    Keil(MDK-ARM)使用教程(三)_在线调试
    Keil(MDK-ARM)使用教程(二)_菜单
  • 原文地址:https://www.cnblogs.com/qwop/p/6637296.html
Copyright © 2020-2023  润新知