第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条:通过私有构造器强化不可实例化的能力的主要内容,如果未能解决你的问题,请参考以下文章

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

《Effective Java 中文版 第2版》学习笔记 第4条:通过私有构造器强化不可实例化的能力

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

Java:Effective java学习笔记之 通过私有构造器强化不可实例化的能力

Effective Java--读书笔记

Effective Java总结的78条