Java限制对象创建的核心是私有构造函数配合静态工厂方法,辅以final类、包级访问或枚举等机制实现受控实例化。

Java 中限制只能通过特定方式创建对象,核心思路是**控制构造函数的访问权限**,并配合**提供受控的创建入口**。不是靠语法强制,而是靠访问修饰符 + 设计约定来实现逻辑上的“唯一路径”。
把构造函数设为 private
这是最直接、最常用的做法。一旦构造函数声明为 private,外部代码就无法用 new 直接实例化该类。
- 适用于单例、工具类、不可变构建器等场景
- 编译器会拒绝
new MyClass(),报错 “constructor is not visible” - 类内部仍可调用私有构造函数,所以静态工厂方法或内部嵌套类可以正常创建实例
提供唯一的静态工厂方法
在私有构造的基础上,公开一个 public static 方法作为唯一创建入口,比如 getInstance() 或 create()。
- 方法内部调用私有构造函数,完成对象创建
- 可加入逻辑:检查单例是否已存在、校验参数、缓存复用、返回子类实例等
- 比构造函数更灵活,名称更具语义(如
fromString()、empty())
配合 final 类防止继承绕过
如果担心子类通过继承+调用 super() 绕过限制,可以把类声明为 final。
立即学习“Java免费学习笔记(深入)”;
- 避免子类重写行为或暴露新的 public 构造函数
- 尤其在工具类(如
Objects、Collections)中常见 - 与 private 构造函数组合使用,形成双重防护
其他辅助手段(按需选用)
某些高级场景还会叠加以下机制:
- 包级私有构造:不加修饰符,仅允许同包内类创建,适合模块内受控协作
- 枚举单例:利用 JVM 对枚举实例化的天然保障,彻底杜绝反射和序列化破坏
- 禁止反射创建:在私有构造中加检查(如判断调用栈),但非绝对安全,仅作提示
- 抛出运行时异常:在构造函数里主动 throw new RuntimeException("Use XXX.create() instead"),增强错误提示


















