private修饰符在单例模式中起限制访问作用,确保构造方法仅类内部可调用,从而阻断外部及子类实例化,为全局唯一实例提供语言级保障。

构造方法私有化在单例模式中,本质是用 private 访问修饰符切断外部直接创建实例的路径,把对象生成权完全收归类内部——这是实现“全局唯一实例”的技术前提。
private 修饰符在这里起什么作用?
Java 的 private 表示该成员(包括构造方法)仅在声明它的类内部可访问。一旦构造方法被标记为 private:
- 其他类(哪怕同包或子类)调用
new Singleton()会编译失败 - 子类无法通过
super()调用它,彻底阻断继承链上的实例化可能 - 反射虽可绕过(需
setAccessible(true)),但属于主动破坏设计契约,生产环境应禁用或记录告警
为什么必须配合静态方法才能用?
私有化后,类自己得提供替代入口,否则这个类就“不可用”了。静态工厂方法(如 getInstance())承担这个角色:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- 它属于类级别,不依赖实例,可在无对象前提下被调用
- 方法内部能自由访问 private 构造方法,完成实例创建
- 还能加入控制逻辑:判空、同步、延迟初始化、参数校验等
不同单例写法中 private 构造方法的角色差异
虽然构造方法始终是 private,但它的“出场时机”和“保障机制”因实现方式而异:
-
饿汉式:类加载时就执行
new Singleton(),靠 JVM 类初始化锁保证线程安全;private 构造在此刻被调用一次 -
懒汉式(双重检查):首次调用
getInstance()时才 new,private 构造只在真正需要时触发,且用 volatile + synchronized 防止指令重排和多线程重复创建 -
静态内部类:利用 JVM 对内部类加载的延迟性,
SingletonHolder.INSTANCE第一次被引用时才初始化,private 构造在此刻执行——兼顾延迟加载与天然线程安全
不写 private 会怎样?
如果构造方法是默认(包级)、protected 或 public:
- 任何代码都能随意
new Singleton(),单例约束立刻失效 - 即使你写了
getInstance(),也无法阻止别人绕过它创建新实例 - 这等于把“唯一性”的承诺建立在开发者的自觉上,而非语言机制,不可靠
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










