编写只包含静态方法和静态域的类,比如我们常写的Util类。我们不希望类被实例化,实例对它没有任何意义。
Java在缺少显式构造器的情况下,编译器会自动提供一个公有的,无参的缺省构造器,有潜在的被实例化的风险。
我们可以显式的指定一个私有的构造器,代码如下:
// Noninstantiable utility class
public class UtilityClass {
// Suppress default constructor for noninstantiability
private UtilityClass() {
throw new AssertionError();
}
}
AssertionError不是必需的,但是可以避免不小心在类的内部调用构造器,或者是反射攻击,保证了该类在任何情况下都不被实例化。
注意:没有公有的构造器,导致这个类不能被子类化,所有的构造器都必须显式或隐式的调用超类构造器。
另外,企图通过将类做成抽象类强制该类不可被实例化是行不通的。因为该类可以被子类化。