今天学习了《Effective Java》的第4条:
第四条:通过私有构造器强化不可实例化的能力
在我们需要编写只包含静态方法和静态字段的类(一般是工具类utility class)时,这样的类只希望在启动时被创建一次。不希望在后续被实例化,因为实例化对这样的工具类没有任何意义。
1. 如果我们直接不给这个类提供任何显式构造器具可以实现类的不可实例化吗?
答案是不行🙅,因为在缺少显式构造器的情况下,编译器会自动提供一个公有的、无参的缺省构造器(default constructor),还是有渠道将这个类实例化。
这也是为什么在单例模式中要记得写一个私有的构造方法。
2. 可以将这个类做成抽象类来实现不可实例化吗?
仍然是不可以的,因为抽象类的子类可以被实例化,而且定义为抽象类会误导用户,让用户以为这个类是专门为了被继承设计的。
正确且简单的方案是:
既然没有显式构造器会在编译时自动提供一个公有构造器,那我们只要让这个类仅包含一个私有的构造器,不就可以保证它不对外提供构造方法了。在需要使用单例的时候,就只能通过静态的 getInstance 方法了。
// 不可实例化的工具类
public class UtilityClass {
// 禁止默认构造函数以实现不可实例化。
private UtilityClass(){
// 避免在类的内部被调用
throw new AssertionError();
}
}
实际运用
单例模式等