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

有些时候,你可能需要编写只含静态方法和静态域的类,例如:

(1)java.lang.Math:组织数学计算有关函数。

(2)java.util.Arrays:把基本类型值或数组类型上的静态方法组织起来。

(3)java.util.Collections:把实现特定接口的对象上的方法组织起来。

最后,还可以利用这种类把final类上的方法组织起来,以取代扩展该类的做法。

这种工具类(utility class)不希望被实例化。为了防止无构造器情况下编译器自动提供一个公有的、无参的缺省构造器,不能使用将类定为抽象类这种方法,而应该使这个类显式地包含私有构造器,这样他就不能被实例化了:

public class Collections{

// Suppresses default constructor, ensuring non-instantiability.

private Collections(){

thrownewAssertionError();

}

...

}

AssertionError不是必须的,但它可以避免不小心在类内部调用构造器。加注释是为了说明这个构造器就是专门设计成不能被调用一样。

副作用:私有化构造器使得一个类不能被子类化。因为子类需要显式或隐式地调用父类的构造器,而私有化构造器使得子类没有可访问的父类构造器可调用了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容