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

时间:2021-02-19 16:10:04
摘要:

对于只有静态方法和静态域的类,可以使用私有构造器防止被实例化。因为实例化这些类毫无意义。

不过这样做也有副作用,就是该类再也无法被继承。


正文:

我们经常会碰到一些工具类,他们只有静态方法或变量。通常这种类不需要实例化,所有使用他们的方法都是直接调用其暴露的静态方法或者变量。

在J2SE中, java.lang.Math,java.util.Arrays和java.util.Collections是明显的列子。

但在开发时,客户端调用程序员可能有时会误解工具类编写者设计某工具类的初衷,导致实例化这些类并使用。所以,将工具类构造器设为私有可以防止这样的情况发生。同时也可以让这些工具类的意义更加明确。

public class  MyUtil{
private MyUtil(){}
public static void myMethod(){...}
}
不过由于这些类的构造器被私有化了,所以无法再被继承,因为子类无法显示或隐式的调用父类的构造器了。

在我看来,这个也不是问题,因为一个纯粹的工具类是没有人希望继承的。就算继承了,也无法调用父类的静态方法。所以这个可以接受。

所以为了设计概念的清晰,建议工具类使用私有构造器。