要么为继承而设计,并提供文档说明,要么禁止继承
2016-07-24 本文已影响63人
想飞的僵尸
第17条:要么为继承而设计,并提供文档说明,要么禁止继承
1.如何编写为继承而设计的类?
(1)对于public或是protected的方法(非final)或是构造器,在文档中要说明它们调用了哪些自己的public或是protected类型的方法(非final),并说明调用顺序,并说明每次调用的作用。
(2)文档编写完成,并发布新版本之后,后续的版本不能违背文档中的细节。
(3)构造器绝对不能调用可被覆盖的方法。
(4)对于实现了Cloneable接口的类,在clone方法中不能调用可被覆盖的方法。
(5)对于实现了Serializable接口的类,readResolve和writeReplace方法必须是protected的。
(6)对于实现了Serializable接口的类,在readObject方法中不能调用可被覆盖的方法。
2. 如何将类设计成不可继承的?
方法一:用final类型来申明这个类。
方法二:将类的构造器申明为private类型的,然后用静态工厂获取到这个类的实例。
3.总结
要设计一个专门为继承而设计的类是十分困难的,所以能用复合就用复合,如果需要被继承的类没有实现类型接口,不能实现复合包装,并且该类还是需要被继承的,那么请不要在可覆盖的方法中调用其它可覆盖方法,或者将想要覆盖的父类方法拷贝一份出来到子类中,做成私有方法,然后用这个私有方法替代调用super.method()(method指的是方法名)。