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

1.背景

有的时候,你可能需要只包含静态方法和静态域的类。这些类的名声很不好,因为有些人在面向对象的语言中滥用这样的类来编写过程化的程序,尽管如此,他们也确实有他们特有的用处。

2.方案

我们可以利用用这种类,以java.lang.Math 或者 java.util.Arrays 的方式,把基本类型的值或者数组类型上的相关方法组织起来。

我们也可以通过 java.util.Collections 的方式,把实现特定接口的对象上的静态方法(包括工厂方法)组织起来。

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

3.问题

这样的工具类不希望被实例化,实例对它没有任何意义。然而,在缺少显示构造器的情况下,编译器会自动提供一个公有的、无参的缺省构造器。用户可以利用这个构造器创建出工具类的实例。这种被无意识实例化的类是不应该的。

4.解决

解决方案很简单,就是手动将无参构造器私有化:

public class Test {
    private Test() {
        throw new AcertionError();
    }
}

5.副作用

这种做法会使得他的子类不能被实例化。因为子类的所有构造器都会显示或者隐式的调用父类的构造器,这种情况下,子类就没有可用的父类构造器了。

results matching ""

    No results matching ""