我有两种基本相同的方法,只是使用不同的类型。我想将这个功能抽象为一些通用方法,我想我可以在C#中使用委托轻松完成,但我不知道Java中的等价物。我只是在这里展示了两种方法,但有几种(如8种)不同的makeWhateverRequest
- 样式方法。以下是我的方法:
public State makeGetRequest(User user, String name) {
Get request = Builder.getGetRequest(user, name);
GetResponse response = service.get(request);
return ResponseTypeFactory.getResponseType(response);
}
public State makePutRequest(User user, String name) {
Put request = Builder.getPutRequest(user, name);
PutResponse response = service.put(request);
return ResponseTypeFactory.getResponseType(response);
}
如果可能存在一些类似委托的事情需要User
和String
(如每个方法的第一行),那将使该行可抽象为泛型方法。但是,请注意第一行返回不同的值(即Get
或Put
的实例),此值用于第二行。每个方法的最后一行已经相同,并使用多态来确定要调用的getResponseType
版本,这样就可以了。
一个难点在于我需要调用不同方法的每种方法的第二行。也许我可以有一些Get
和Put
实现的接口,然后需要一个类似委托的东西,它接受该接口的一个实例。然后,GetResponse
和PutResponse
可能都可以实现不同的接口,我可以确保有一个getResponseType
接受该接口的实例。
Get
和Put
继承自公共基类Request
。 GetResponse
和PutResponse
继承自公共基类Response
。我可能会使这些基类抽象,然后,而不是有不同的接口,我可以有方法,需要抽象基类的实例。
我对Java不太熟悉,所以我不知道在C#中做的事情的等效方式。谢谢你的帮助。
编辑:以下是我对可能需要的接口的想法:
IRequest IResponse
| \ | \
Get Put GetResponse PutResponse
然后我需要这些方法:
Builder.getRequest(User, String)
=> IRequest
service.getPut(IRequest)
=> IResponse
ResponseTypeFactory.getResponseType(IResponse)
=> State
答案 0 :(得分:2)
我不认为Java有一种很好的方法来改进你拥有的东西。你可以用接口做一些事情,但它会更冗长。如果你的方法真的只有3行,我会坚持你拥有的。代码清晰,复制很少。
答案 1 :(得分:1)
Java通常使用单个方法接口和匿名内部类来代替委托,但对于您发布的示例,它们肯定会过于冗长。
如果您想使代码更通用,那么您的编辑就是答案。您需要更改Builder.getRequest方法,以便它接收一个参数,指示Get或Put是否符合您的要求(除非可以从'user'或'name'参数中推断出来。)
在一篇不相关且可能存在争议的说明中,您可能需要考虑使用Dependency Injection而不是静态方法来构建Builder和ResponseTypeFactory。
答案 2 :(得分:0)
基本示例:
public enum RequestMethod { GET, PUT /* Add remaining here */ };
public State makeRequest(RequestMethod method, User user, String name) {
Object response;
switch (method) {
case GET:
response = service.get(Builder.getGetRequest(user, name));
break;
case PUT:
response = service.put(Builder.getPutRequest(user, name));
break;
// Add remaining cases here.
}
return ResponseTypeFactory.getResponseType(response);
}
答案 3 :(得分:0)
我使用反射在Java中实现了回调/委托支持。详细信息和工作来源为available on my website。这符合你要做的事情。