我有两个方法基本上做同样的事情,只是类型不同。我想将此功能抽象为一些通用方法,我认为我可以在 C# 中使用委托(delegate)轻松完成此操作,但我不知道 Java 中的等价物。我在这里只展示了其中的两种方法,但还有几种(比如八种)不同的 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);
}
如果可能有一些类似委托(delegate)的东西需要一个 User
和一个 String
(就像在每个方法的第一行中一样),那么那一行可抽象为通用方法。但是,请注意,第一行返回了一个不同的值(即 Get
或 Put
的实例)并且该值在第二行中使用。每个方法的最后一行已经相同,并使用多态性来确定要调用哪个版本的 getResponseType
,这样就可以了。
一个困难是每个方法的第二行,我需要在其中调用不同的方法。也许我可以有一些Get
和Put
实现的接口(interface),然后需要一个类似委托(delegate)的东西来获取该接口(interface)的一个实例。那么也许 GetResponse
和 PutResponse
都可以实现不同的接口(interface),我可以确保有一个 getResponseType
接受该接口(interface)的实例。
Get
和 Put
继承自一个公共(public)基类 Request
。 GetResponse
和 PutResponse
继承自一个公共(public)基类 Response
。我可能可以将这些基类抽象化,然后,我可以只使用采用必要的抽象基类实例的方法,而不是使用不同的接口(interface)。
我对 Java 不是很熟悉,所以我不知道用 C# 做事的等效方法。感谢您的帮助。
编辑:以下是我对可能需要哪些接口(interface)的想法:
IRequest IResponse
| \ | \
Get Put GetResponse PutResponse
然后我需要这些方法:
Builder.getRequest(User, String)
=> IRequest
service.getPut(IRequest)
=> IResponse
ResponseTypeFactory.getResponseType(IResponse)
=> State
最佳答案
我认为 Java 中没有改进现有内容的好方法。你可以用接口(interface)做一些事情,但它会更冗长。如果你的方法真的只有 3 行,我会坚持你所拥有的。代码清晰,重复最少。
关于java - 从 Java 中的两个方法抽象代码,也许使用委托(delegate)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1993616/