Effective Java 学习札记第3条 - 通过私有的构造函数强化不可实例化的能力
Effective Java 学习笔记第3条 --- 通过私有的构造函数强化不可实例化的能力
在面向对象程序设计中,假如存在太多只有静态属性和静态方法的类;那么,面向对象的思想可能在这会损失殆尽。但是,并不能说面向对象的程序中就不应该出现 只有静态属性和静态方法的类,相反,有时候我们还必须写这样的类作为工具类。这样的类怎么实现呢?有人可能会把该类定义成抽象类(Abstract class),的确,抽象类是不可以实例化的,但是别忘了还有继承,继承了抽象类的子类在实例化时候,默认是会先调用父类无参数的构造函数的 (super();),这时候,父类不是也被实例化了嘛?其实我们可以这样做,把该类的构造函数定义为私有的(private),而类的内部又不调用该构 造函数的话,就成功了。这样带来的后果就是该类成了 final的,不可能再被任何类继承了,要被继承,得提供一个公有(public)的或者保护(protect)的构造函数,这样才能被子类调用。
//Noninstantiable utility class public class UtilityClass { // Suppress default constructor for noninstantiability private UtilityClass() { // This constructor will never be invoked } ... // Remainder omitted }