4.通过私有化构造器强化不可实例化的能力
2016-08-24 本文已影响90人
陈继科
有些时候,你可能需要编写只含静态方法和静态域的类,例如:
(1)java.lang.Math:组织数学计算有关函数。
(2)java.util.Arrays:把基本类型值或数组类型上的静态方法组织起来。
(3)java.util.Collections:把实现特定接口的对象上的方法组织起来。
这种工具类(utility class)不希望被实例化。为了防止无构造器情况下编译器自动提供一个公有的、无参的缺省构造器,不能使用将类定为抽象类这种方法,而应该使这个类显式地包含私有构造器,这样他就不能被实例化了:
public class Collections {
// Suppresses default constructor, ensuring non-instantiability.
private Collections() {
throw new AssertionError();
}
...
}
AssertionError不是必须的,但它可以避免不小心在类内部调用构造器。加注释是为了说明这个构造器就是专门设计成不能被调用一样。
私有化构造器使得一个类不能被子类化。因为子类需要显式或隐式地调用父类的构造器,而私有化构造器使得子类没有可访问的父类构造器可调用了。