[关闭]
@XingdingCAO 2017-11-01T04:12:20.000000Z 字数 949 阅读 1821

Effective Java(第2版):Item 4 —— Enforce noninstantiability with a private constructor

Java constructor


只包含静态成员的类

有时候,你会写一个只包含静态字段和静态方法的类。这样的类并没有很好的声誉,因为有些人滥用这样的类来逃避面向对象的编程。但是,这样的类确实也有着正确的使用:
1. 对原始类型或数组的方法的集合java.util.Arrays java.lang.Math
2. 对静态方法(包括静态工厂方法)的聚合java.util.Collections
3. 对被final修饰的类的操作的静态方法的集合。

Utility/Helper Class

上述的对只静态成员的类的第一种用法就可以被称为Utility/Helper Class(实用类或帮助类)。这种类并不封装任何的状态,所以它不应该被实例化。

禁止实例化

absence of explicit constructor(not work)

首先,最直觉的方法就是什么构造方法也不写。可惜,如果缺乏显式的构造方法,那么编译器默认会提供一个公开的无参构造方法。而且,这样的方式在公开的API中并不常见,因为这样既缺乏明显的语句也会造成无意识的可实例化的后果。

abstract class(not work)

使实用类变成抽象的,并不能保证完全的禁止实例化。因为这个抽象的类可以被继承,然后实例化。其次,这样的操作会误导使用者。

private constructor
  1. // Noninstantiable utility class
  2. public class UtilityClass {
  3. // Suppress default constructor for noninstantiability
  4. private UtilityClass() {
  5. throw new AssertionError();
  6. }
  7. ... // Remainder omitted
  8. }
禁止实例化的弊端

显而易见,一个类拥有一个private的构造方法后,它就不能被继承了。因为无论显式还是隐式都无法调用到该类的构造方法,子类的构造难以进行下去。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注