前言
《Effective Java》中文第三版,是一本关于Java基础的书,这本书不止一次有人推荐我看。其中包括我很喜欢的博客园博主五月的仓颉,他曾在自己的博文《给Java程序猿们推荐一些值得一看的好书》中也推荐过。加深自己的记忆,同时向优秀的人看齐,决定在看完每一章之后,都写一篇随笔。如果有写的不对的地方、表述的不清楚的地方、或者其他建议,希望您能够留言指正,谢谢。
《Effective Java》中文第三版在线阅读链接:https://github.com/sjsdfg/effective-java-3rd-chinese/tree/master/docs/notes
是什么
非实例化:不用实例化的类。(实例化没有任何意义,此时这个类我们希望它是非实例化的)
哪里用
编写一个工具类的时候。对于工具类,实例化对它们来说是没有任何意义的,然而一个类我们都知道,在没有声明构造方法的时候,编译器会默认提供一个公共的、无参的构造器。
怎么实现
/** * 不用实例化的工具类 * * @Author GongGuoWei * @Email GongGuoWei01@yeah.net * @Date 2020/1/11 */ public class UtilityClass { //使用私有构造方法,抑制默认构造函数的不稳定性 private UtilityClass() { //AssertionError 避免不小心在类的内部调用构造器 throw new AssertionError(); } }
可以看到,我们自己声明了一个构造器(显式构造器),编译器不会默认一个无参的构造器,显式构造器是私有的,所以不可以在类的外部访问它。
总结
使用私有构造器执行非实例化,其实主要用在工具类,不用实例化,工具类就可以向调用者提供服务。实例化的过程其实本质是向内存中申请一个空间,我们对于不用实例化的类,避免它使用编译器默认的实例方法,这样节约了内存,也避免了非实例化类的默认构造函数不稳定性。不过这种写法,也有一种缺点,让调用者查看时,会感觉构造器就是设计成不能调用的一样,因此添加一句注释,会是一种明智的选择。