3 回答
TA贡献1799条经验 获得超8个赞
我想你想要的是
class Service {
private Client client;
public void fix(Consumer<Client> consumer){
consumer.accept(client);
method();
}
private void method() {}
}
您可以使用
service.fix(Client::fetchB);
TA贡献1803条经验 获得超3个赞
这个问题可能有点基于意见,但让我们试一试。
在我看来,您制造的第一个设计缺陷是将所有fetchXYZ方法都放在一个客户端中。你可以创建一个Client看起来像这样的界面
interface Client<T> {
T fetch();
}
并像这样创建这个接口的实现:
public class ClientA implements Client<A> {
@RequestLine(”something/a“)
public A fetch() {
// do fetch stuff
}
}
您可以将客户端实现的实例本地存储在地图中,或者使用工厂模式根据您的输入创建正确的客户端。最后fix,您的服务中的方法可能如下所示:
public void fix(String clientType) {
// returns instance of ClientA for ’a‘ for example
final Client client = getClientForType(clientType);
client.fetch();
method();
}
可能有很多方法可以解决您的需求,这只是其中之一。
我个人不喜欢传球的客户端功能作为参数传递给你的方法的想法(虽然你问它),在当前的设计Client有不同的责任(取A,B依此类推)。使用 lambda 表达式实际上强化了这个缺陷,并且进一步隐藏了Client实际作用。
只有我的 2 美分。
TA贡献2039条经验 获得超7个赞
一种方法是将调用作为服务方法的参数传递给您的客户端。你需要使用泛型:
class Service {
Client client;
public <T> void fix(Function<Client, T> clientCall) {
T result = clientCall.apply(client);
// Do something with result
method();
}
}
您需要fix按如下方式调用您的服务方法:
service.fix(Client::fetchA);
添加回答
举报