我想到了四个原因:
- 允许实例化子类,但不允许实例化父类;
- 禁止直接实例化,而是提供返回的工厂方法,并在必要时创建实例;
- 因为所有的实例都是预定义的(例如,在一副纸牌中装),尽管从Java 5开始,建议使用typeafe枚举;和
- 这个类真的不是一个类。它只是静态常量和/或方法的持有者。
作为 (2) 的示例,您可能希望创建规范对象。例如,RGB 颜色组合。您不想创建任何 RGB 组合的多个实例,因此请执行以下操作:
public class MyColor {
private final int red, green, blue;
private MyColor(int red, int green, int blue) {
this.red = red;
this.green = green;
this.blue = blue;
}
public static MyColor getInstance(int red, int green, int blue) {
// if combo already exists, return it, otherwise create new instance
}
}
注意:不需要无参数构造函数,因为另一个构造函数是显式定义的。