从Java中的两个方法中抽象代码,也许使用委托?

时间:2010-01-03 01:40:46

标签: java interface delegates abstraction

我有两种基本相同的方法,只是使用不同的类型。我想将这个功能抽象为一些通用方法,我想我可以在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);
}

如果可能存在一些类似委托的事情需要UserString(如每个方法的第一行),那将使该行可抽象为泛型方法。但是,请注意第一行返回不同的值(即GetPut的实例),此值用于第二行。每个方法的最后一行已经相同,并使用多态来确定要调用的getResponseType版本,这样就可以了。

一个难点在于我需要调用不同方法的每种方法的第二行。也许我可以有一些GetPut实现的接口,然后需要一个类似委托的东西,它接受该接口的一个实例。然后,GetResponsePutResponse可能都可以实现不同的接口,我可以确保有一个getResponseType接受该接口的实例。

GetPut继承自公共基类RequestGetResponsePutResponse继承自公共基类Response。我可能会使这些基类抽象,然后,而不是有不同的接口,我可以有方法,需要抽象基类的实例。

我对Java不太熟悉,所以我不知道在C#中做的事情的等效方式。谢谢你的帮助。

编辑:以下是我对可能需要的接口的想法:

IRequest              IResponse
|     \                |     \
Get   Put       GetResponse  PutResponse

然后我需要这些方法:

Builder.getRequest(User, String)
=> IRequest

service.getPut(IRequest)
=> IResponse

ResponseTypeFactory.getResponseType(IResponse)
=> State

4 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

Java通常使用单个方法接口和匿名内部类来代替委托,但对于您发布的示例,它们肯定会过于冗长。

如果您想使代码更通用,那么您的编辑就是答案。您需要更改Builder.getRequest方法,以便它接收一个参数,指示Get或Put是否符合您的要求(除非可以从'user'或'name'参数中推断出来。)

在一篇不相关且可能存在争议的说明中,您可能需要考虑使用Dependency Injection而不是静态方法来构建Builder和ResponseTypeFactory。

答案 2 :(得分:0)

您还可以考虑使用enumswitch声明。

基本示例:

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。这符合你要做的事情。