私有构造方法强制通过静态工厂方法(如getinstance)获取实例,支持饿汉式(类加载时创建)和懒汉式(首次调用时创建),可实现参数校验、多态返回、资源复用等增强逻辑。

构造方法私有化后,类外不能直接用 new 创建对象,但可以通过类内部提供的静态工厂方法来获取实例。这是设计上的主动控制,不是限制,而是为了统一管理对象的创建逻辑。
必须通过静态方法获取实例
私有构造方法意味着外部无法调用它,所以类必须自己提供一个公开的、静态的入口。这个方法通常返回本类的一个对象引用:
- 方法必须是 public static,比如
getInstance()、create()或of() - 方法内部可以 new 出对象(因为是在本类中调用私有构造器)
- 返回的对象可以是新创建的,也可以是预先缓存好的(如单例)
常见写法:饿汉式与懒汉式
两种主流实现方式,区别在于实例创建时机:
-
饿汉式:类加载时就创建好唯一实例,线程安全但可能浪费资源
private static final Singleton instance = new Singleton();public static Singleton getInstance() { return instance; } -
懒汉式:首次调用
getInstance()时才创建,节省资源但需注意多线程安全private static Singleton instance;public static synchronized Singleton getInstance() { if (instance == null) instance = new Singleton(); return instance; }
支持参数校验和复杂初始化
静态工厂方法不只是“绕过 private”,还能做更多事:
- 接收参数并做合法性检查,再决定是否创建对象
- 根据参数返回不同子类实例(类似简单工厂)
- 记录日志、统计调用次数、配合对象池复用实例
- 例如:
User createUser(String name, int age)可先判断age > 0再 new User
注意不能用反射强行突破(不推荐)
虽然反射可通过 setAccessible(true) 调用私有构造器,但这违背了设计初衷:
- 破坏封装性,使单例失效、校验失效、初始化逻辑被跳过
- 在安全管理器启用或模块化(Java 9+)环境下可能被阻止
- 仅限测试或特殊工具场景,生产代码应严格走静态方法
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











