3

タイプが異なるだけで、本質的に同じことを行う 2 つのメソッドがあります。この機能をいくつかの汎用メソッドに抽象化したいのですが、デリゲートを使用して C# で簡単に実行できると思いますが、Java で同等のものを知りません。makeWhateverRequestここでは 2 つのメソッドのみを示していますが、スタイルの異なるメソッドがいくつか (8 つほど) あります。ここに私の方法があります:

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(各メソッドの最初の行のように) aと aを取るデリゲートのようなものがあれば、Stringその行はジェネリック メソッドに抽象化できます。ただし、最初の行は異なる値 (つまり、 または のいずれかのインスタンス) を返し、GetこのPut値は 2 行目で使用されることに注意してください。各メソッドの最後の行はすでに同じで、ポリモーフィズムを使用してどのバージョンのgetResponseTypeを呼び出すかを判断しているので、問題ありません。

1 つの問題は、別のメソッドを呼び出す必要がある各メソッドの 2 行目にあります。Getおそらく、実装と実装の両方を行ういくつかのインターフェイスを用意しPut、そのインターフェイスのインスタンスを取るデリゲートのようなものを必要とすることができます。次に、GetResponseとの両方PutResponseが別のインターフェイスを実装する可能性があり、getResponseTypeそのインターフェイスのインスタンスを取る があることを確認できます。

GetPut共通の基本クラスから継承しますRequest。 共通の基本クラスから継承しGetResponseます。おそらく、これらの基本クラスを抽象化して、異なるインターフェイスを持つ代わりに、必要な抽象基本クラスのインスタンスを取るメソッドを持つことができます。PutResponseResponse

私は 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は通常、デリゲートに相当する単一のメソッドインターフェイスと匿名の内部クラスを使用しますが、投稿した例には間違いなく冗長すぎます。

コードをもう少し一般的にしたい場合は、編集が答えです。Get または Put が必要なものであるかどうかを示すパラメーターを受け取るように Builder.getRequest メソッドを変更する必要があります ('user' または 'name' パラメーターのいずれかから推測できる場合を除く)。

これとは関係なく、物議を醸す可能性があることに注意してください。Builder と 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 に答える