类似 java.lang.Math
和 java.util.Arrays
等类, 只包含静态方法和静态域. 这些类不希望被实例化.
对于普通的类,缺少显式构造器时, 编译器会自动提供一个公有的,无参的缺省构造器.
所以只要让类包含私有的构造器,这样就不会被示例化了:
// Noninstantiable utility class
public class UtilityClass {
// Suppress default constructor for noninstantiability
private UtilityClass() {
throw new AssertionError();
}
... // Remainder omitted
}
由于显式构造器时私有的,所以不可以在该类的外部访问它.
这种做法的副作用: 使一个类不能被子类化. (因为所有的构造器都必须显式或隐式的调用超类构造器)
网友评论