【发布时间】:2020-04-08 06:54:45
【问题描述】:
假设我在客户端对象上有不同的方法,我需要将它们的引用作为我端的高阶函数的参数:
// client class example methods
public Response method1(Request request);
public Response method2(Request request, String name);
public Response method3(Request request, String title, String description);
// my class
public Response invokeClientMethod(RequestHandler handler){
// do something with method reference
}
// client code passes a reference to any of those methods as an argument to my function
myClass.invokeClientMethod(clientClass::method1);
myClass.invokeClientMethod(clientClass::method2);
myClass.invokeClientMethod(clientClass::method3);
这些方法总是将Request 对象作为第一个参数,返回一个Response 对象,并在第一个Request 参数之后采用任意数量的String 参数。我希望客户能够在他们的类中以上述格式创建任何这些函数,然后将其方法引用作为参数传递给我的函数。
因此,如果可能的话,我希望能够使用相同的功能接口来保留对所有这些方法的引用。我尝试了以下方法:
@FunctionalInterface
public interface RequestHandler{
Response apply(Request request, String... args);
}
但这个函数式接口只能保留对本身是显式可变参数的方法的引用,如下所示:
// client class
public Response method4(Request request, String... args);
根据设计,我不希望我的客户将他们的函数显式定义为可变参数方法 (String...),因为这会损害可读性。我可以创建一个函数式接口,该接口可以存储对包含任意数量参数的方法的方法引用本身不是可变参数函数吗?
我也不希望最终做这样的事情:
@FunctionalInterface
public interface RequestHandlerWithNoArgs{
Response apply(Request request);
}
@FunctionalInterface
public interface RequestHandlerWithOneArg{
Response apply(Request request, String arg1);
}
@FunctionalInterface
public interface RequestHandlerWithTwoArgs{
Response apply(Request request, String arg1, String arg2);
}
// my class
public Response invokeClientMethod(RequestHandlerWithNoArgs requestHandler);
public Response invokeClientMethod(RequestHandlerWithOneArg requestHandler);
public Response invokeClientMethod(RequestHandlerWithTwoArgs requestHandler);
// ...
【问题讨论】:
-
您实际上打算如何调用您作为
requestHandler传递的方法,您将传递什么参数以及多少?您可能不得不使用反射而不是使用功能接口。您将失去所有类型安全,但那是因为在类型安全恕我直言时无法完成您想要实现的目标。 -
未显示,但我实际上在
invokeClientMethod中有另一个参数,我可以推断出需要传递给requestHandler的参数数量。我最初的计划是推断该信息,然后调用.args(部分)或.applyn 次。我不想完全使用反射,因为我想给我的客户某种形式的编译时安全性——如果我让我的客户将方法的完全限定名称作为字符串传递,我就没有办法了验证该方法是否在运行时之前确实存在...
标签: java functional-programming functional-interface