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條經驗 獲得超8個贊
一種方法是將調用作為服務方法的參數傳遞給您的客戶端。你需要使用泛型:
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);
添加回答
舉報