构造器引用是方法引用的一种,形式为classname::new,用于匹配函数式接口以延迟创建对象。它需通过supplier.get()、function.apply()等触发实际实例化,不比new快,但利于解耦、工厂抽象和函数式编程场景。

Java 中没有“构造器引用”这种语法来直接创建对象,但你可能指的是 方法引用(Method Reference)中对构造器的引用,即用 ::new 语法配合函数式接口,实现延迟、间接地创建对象。它本身不“快速创建”,而是为函数式编程提供简洁写法,真正创建发生在调用时。
什么是构造器引用(Constructor Reference)
构造器引用是方法引用的一种,形式为 ClassName::new,表示“调用该类的某个构造器”。它不是独立创建对象的语句,而是一个可赋值给函数式接口的引用,需搭配如 Supplier、Function、BiFunction 等使用。
-
Person::new可匹配Supplier<person></person>(无参构造) -
Person::new也可匹配Function<string person></string>(若存在Person(String name)) - 重载时,编译器根据目标函数式接口的抽象方法签名自动选择对应构造器
如何用构造器引用创建对象
必须通过函数式接口的抽象方法触发实际创建,常见方式:
- 用
Supplier.get()触发无参构造:Supplier<person> supplier = Person::new;<br> Person p = supplier.get(); // 此时才真正 new 出对象</person>
- 用
Function.apply()传参创建:Function<string person> factory = Person::new;<br> Person p = factory.apply("Alice"); // 调用 Person(String name)</string> - 用
BiFunction.apply()创建带两个参数的对象:BiFunction<string integer person> builder = Person::new;<br> Person p = builder.apply("Bob", 28); // 调用 Person(String name, int age)</string>
和直接 new 的区别与适用场景
构造器引用不比 new Person() 更快,也不简化单次创建;它的价值在于解耦与抽象:
- 适合工厂逻辑集中管理,比如统一日志、权限校验或对象池包装
- 在 Stream、Optional 或框架回调中传递创建逻辑,避免重复写 new
- 配合依赖注入或策略模式,运行时动态切换构造行为(如不同子类)
- 不能用于私有/受限构造器,除非目标接口允许并配合反射(此时已脱离构造器引用本意)
注意点
使用前需确保:
- 目标类存在匹配参数类型的 public 构造器
- 函数式接口抽象方法的参数个数、类型、返回值与构造器严格一致
- 若构造器抛出受检异常,函数式接口也需声明该异常(标准接口不支持,需自定义)
- 构造器引用本身不执行初始化,只是准备了一个可执行的创建蓝图
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











