第4条:通过私有构造器强化不可实例化的能力
Posted MachineChen
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第4条:通过私有构造器强化不可实例化的能力相关的知识,希望对你有一定的参考价值。
对只有静态方法和域的类,主要用于把基本类型的值或数据类型上的相关方法组织起来(Math,Arrays),可以通过Collections的方法把实现特定接口的对象上的惊天方法组织起来,可以利用这种类把final类上的方法组织起来,以取代扩展该类的做法。此工具类是不希望被实例化的,实例化对他么有任何意义。然后我们如果不提供构造器,jvm会自己提供,那还是会被实例化,那么我们只要在类中提供一个私有的构造器就可以了,并添加注释说明。 这样带来的问题是不能子类化,因为子类要求要求super父类的构造函数。
场景:
在创建工具类的时候,大部分是无需实例化的,实例化对它们没有意义。在这种情况下,创建的类,要确保它是不可以实例化的。
存在问题:
在创建不可实例化的类时,虽然没有定义构造器。但是,客户端在使用该类的时候,依然可以实例化它。客户端,可以继承该类,通过实例化其子类来实现实例化;客户端可以调用默认的构造器来实例化该类。
要避免这个问题,使用的方式是,定义一个私有的构造器:
public class UtilityClass
// Suppress default constructor for noninstantiability
private UtilityClass()
throw new AssertionError();
添加 throw new AssertionError(),是避免在UtilityClass实例化UtilityClass类。
因为有了私有的无参构造器,这样客户端就没有办法调用默认构造器来实例化该类;也避免了继承的子类被实例化的问题。
以上是关于第4条:通过私有构造器强化不可实例化的能力的主要内容,如果未能解决你的问题,请参考以下文章
《Effective Java 中文版 第2版》学习笔记 第4条:通过私有构造器强化不可实例化的能力
Effective Java -- 通过私有构造器强化不可实例化的能力