3

我有两种方法基本上做同样的事情,只是类型不同。我想将此功能抽象为一些通用方法,我想我可以在 C# 中使用委托轻松完成,但我不知道 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);
}

如果可能有一些类似委托的东西需要 aUser和 a String(如在每个方法的第一行中),那将使该行可抽象为泛型方法。但是,请注意,第一行返回一个不同的值(即,一个Get或的实例Put),并且该值在第二行中使用。每个方法的最后一行已经是一样的了,使用多态性来判断调用哪个版本getResponseType,这样就可以了。

一个困难是每个方法的第二行我需要调用不同的方法。也许我可以有一些既可以实现又可以实现的接口GetPut然后需要一个类似于委托的东西来获取该接口的实例。然后也许两者都GetResponse可以PutResponse实现不同的接口,我可以确保有一个getResponseType采用该接口的实例。

GetPut从一个公共基类继承,Request. GetResponsePutResponse从一个公共基类继承,Response. 我可能可以将这些基类抽象化,然后,我可以只使用方法来获取必要的抽象基类的实例,而不是使用不同的接口。

我对 Java 不是很熟悉,所以我不知道在 C# 中做事的等效方法。谢谢您的帮助。

编辑: 这是我对可能需要哪些接口的想法:

IRequest              IResponse
|     \                |     \
Get   Put       GetResponse  PutResponse

然后我需要这些方法:

Builder.getRequest(User, String)
=> IRequest

service.getPut(IRequest)
=> IResponse

ResponseTypeFactory.getResponseType(IResponse)
=> State
4

4 回答 4

2

我不认为在 Java 中有一个很好的方法来改进你所拥有的。你可以用接口做一些事情,但它会更冗长。如果你的方法真的只有 3 行,我会坚持你所拥有的。代码清晰,重复最少。

于 2010-01-03T01:47:25.540 回答
1

Java typically uses single method interfaces and anonymous inner classes for the equivalent of delegates but they would definitely be too verbose for the examples you've posted.

Your edit is the answer if you want to make your code a little more generic. You will need to change the Builder.getRequest method so that it takes in a parameter that indicates whether a Get or a Put is what you require (unless that can be deduced from either the 'user' or 'name' parameter).

On an unrelated and potentially controversial note, you may want to consider using Dependency Injection instead of static methods for Builder and ResponseTypeFactory.

于 2010-01-03T02:05:54.917 回答
0

我已经使用反射在 Java 中实现了回调/委托支持。详细信息和工作源可在我的网站上找到。这将适合您正在尝试做的事情。

于 2010-01-16T00:25:42.117 回答
0

您还可以考虑使用enumandswitch语句。

基本示例:

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);
}
于 2010-01-03T02:35:10.677 回答