必须是private,因为单例要求对外禁止重复创建,若构造函数非private,外部代码可通过new随意实例化,破坏唯一性;设为private后仅类内可调用,确保getInstance()能安全创建唯一实例。

要实现单例模式,构造函数必须设为 private。
为什么必须是 private
单例的核心是“对外禁止重复创建”,而 new 操作直接调用构造函数。只要构造函数对外可见(如 public 或 protected),外部代码就能随意 new 出多个实例,彻底破坏单例语义。
设置为 private 后,只有本类内部可以调用该构造函数——这为 getInstance() 方法内部安全地创建唯一实例提供了前提。
常见错误设置及后果
- public 构造函数:任何类都能 new,完全失去单例约束
- protected 或默认(包私有):同包子类或包内其他类仍可 new,无法保证全局唯一
- private 是唯一安全选择:彻底封禁外部实例化路径,强制走统一入口
配合 private 构造函数的关键操作
- 声明一个 static 的私有实例字段(饿汉式直接初始化,懒汉式延迟创建)
- 提供一个 public static 方法(如 getInstance())作为唯一获取实例的通道
- 多线程场景下,懒汉式需加 synchronized 或使用双重检查 + volatile 防止指令重排
- 若支持序列化,还需实现 readResolve() 方法,防止反序列化生成新对象
一个最小可行示例(饿汉式)
public class Singleton {
private static final Singleton instance = new Singleton();
private Singleton() {} // ← 关键:private 构造函数
public static Singleton getInstance() { return instance; }
}
立即学习“Java免费学习笔记(深入)”;


















