Effective Java 第4条 通过私有构造器强化不可实例化的能力

通过私有构造器强化不可实例化的能力

有时候可能需要编写只包含静态方法和静态域的类,类似java.lang.Math和 java.util.Arrays的方式,把基本类型的值,或者数组类型上的相关方法组织起来,类似java.util.Collections的方式,把实现特定接口的对象上的方法,包括工厂方法,组织起来。

这样的工具类不希望被实例化,因为没有任何意义,但是在缺少显式构造器的情况下,编译器会自动提供一个公有的,无参的隐式构造器。

企图将类定义为抽象类来强制该类不可被实例化也是行不通的,该类还是可以被子类化,并且子类也是可以被实例化的。然后,有一个简单的方式可以确保类不被实例化,由于只有当类不包含显式的构造器,编译器才会自动生成隐式无参构造器,所以只需要在类中保留一个私有的构造器,就能保证不被实例化。

public class FoodFactory{
    
    
    private FoodFactory{
    
    
       throw new AssertionError();
    }
	public static Food getFoodFactory(String arg1){
    
    
	...
	}
}

由于显式的构造器是私有的,所以不可能在该类的外部访问它,AssertionError()不是必须的,但是可以避免不小心在内部调用构造器,它可以保证在任何情况下都不能实例化该类。

这种习惯也有副作用,它使得一个类不能被子类化,所有的构造器都必须显式或者引式的调用超类构造器,在这种情况下,子类就没有可访问的超类构造器可调用了。


参考文章:https://www.jianshu.com/p/17e10c460005

猜你喜欢

转载自blog.csdn.net/qq_38941937/article/details/115311616