我知道我可以使用构造函数引用作为高阶方法的参数,如下所示:
collection.stream().map(MyClass::new);
但是我有
MyClass
作为变量 Class<MyClass> clazz = MyClass.class
。
我可以使用它来将构造函数引用传递给 .map(Function)
方法吗?
我想做这样的事情,有什么办法吗?
Class<MyClass> clazz = MyClass.class;
collection.stream().map(clazz.getConstructor())
标准免责声明: 使用反射几乎总是一个坏主意。
最好选择标准的抽象工厂或类似的。
但是,
MethodHandle
将以最小的开销构造所需的Function
对象(我认为)。如果您每次都查找 fn
,则会产生开销。
Function<T, R> fn = (Function<T, R>)
MethodHandleProxies.asInterfaceInstance(
Function.class,
MethodHandles.lookup().findConstructor(clazz,
MethodType.methodType(Void.TYPE, tClass)
)
);
异常处理被省略。
在软件设计中,RequestExecutor(或任何其他组件)在构造函数中的放置可能会有所不同,具体取决于开发人员或开发团队所做的特定设计模式和架构选择。但是,出于一些常见原因,可能会在对象创建级别将 RequestExecutor 或类似组件放置在构造函数中: 依赖注入:将RequestExecutor放在构造函数中通常是实现依赖注入的一种方法。依赖注入是一种设计模式,它通过从外部传递组件的依赖关系(例如 RequestExecutor)而不是在类中创建它们来促进组件之间的松散耦合。这使得类更加灵活、可测试,并且允许您轻松交换 RequestExecutor 的不同实现,而无需修改类本身。 可配置性:通过构造函数注入RequestExecutor,您可以在创建时配置对象的行为。同一类的不同实例可以有不同的 RequestExecutor 实现或配置,允许您根据特定需求定制它们的行为。 可测试性:将像 RequestExecutor 这样的依赖项放在构造函数中可以更轻松地编写单元测试。您可以在测试类时提供 RequestExecutor 的模拟或存根实现,使您能够隔离类的行为并确保其在不同场景下正常运行。