@XingdingCAO
2017-11-01T12:12:20.000000Z
字数 949
阅读 2015
Java
constructor
有时候,你会写一个只包含静态字段和静态方法的类。这样的类并没有很好的声誉,因为有些人滥用这样的类来逃避面向对象的编程。但是,这样的类确实也有着正确的使用:
1. 对原始类型或数组的方法的集合java.util.Arrays
java.lang.Math
2. 对静态方法(包括静态工厂方法)的聚合java.util.Collections
3. 对被final
修饰的类的操作的静态方法的集合。
上述的对只静态成员的类的第一种用法就可以被称为Utility/Helper Class(实用类或帮助类)。这种类并不封装任何的状态,所以它不应该被实例化。
首先,最直觉的方法就是什么构造方法也不写。可惜,如果缺乏显式的构造方法,那么编译器默认会提供一个公开的无参构造方法。而且,这样的方式在公开的API中并不常见,因为这样既缺乏明显的语句也会造成无意识的可实例化的后果。
使实用类变成抽象的,并不能保证完全的禁止实例化。因为这个抽象的类可以被继承,然后实例化。其次,这样的操作会误导使用者。
// Noninstantiable utility class
public class UtilityClass {
// Suppress default constructor for noninstantiability
private UtilityClass() {
throw new AssertionError();
}
... // Remainder omitted
}
显而易见,一个类拥有一个private
的构造方法后,它就不能被继承了。因为无论显式还是隐式都无法调用到该类的构造方法,子类的构造难以进行下去。