2017-02-15 3 views
2

HttpGetとHttpPostで使用される関数を記述しています。問題はHttpRequestBaseが.setEntityをサポートしていないということですJava 8 HttpClient 4.5 HttpGetとHttpPostを1つの関数で実装する

private void initialize(HttpRequestBase method) 
{ 
    if(method == new HttpPost()) 
    { 
    String body = "body"; 
     HttpEntity entity = new ByteArrayEntity(body.getBytes("UTF-8")); 
     method.setEntity(entity); 
} 

: それはそのようなことです。どのようにしてHttpGetとHttpPostをサポートする関数を書くことができますか?

+1

あなたはあなたのif条件が決して真実ではないことを知っていますか?新しいオブジェクトと比較された既存のオブジェクト参照は 'false'を返します。 – RealSkeptic

+0

ああ、そうです。どんなアプローチですか? –

+0

'if(メソッドインスタンスHttpPost)' –

答えて

2

この問題を回避するには、instanceofを使用して型をチェックし、キャストを使用します。このように:

private void initialize(HttpRequestBase method) 
{ 
    if(method instanceof HttpPost) 
    { 
     String body = "body"; 
     HttpEntity entity = new ByteArrayEntity(body.getBytes("UTF-8")); 
     ((HttpPost) method).setEntity(entity); 
    } 
} 

キャストを使用するときはいつでも、より洗練されたソリューションがあると考えるべきです。この場合、私は、より洗練されたソリューションは、メソッドのオーバーロードを使用し、HttpPostインスタンスに対して特定のメソッドを使用することであると主張します。もちろん

private void initialize(HttpPost method) 
{ 
    String body = "body"; 
    HttpEntity entity = new ByteArrayEntity(body.getBytes("UTF-8")); 
    method.setEntity(entity); 
} 

これはあなたがHttpGet用に別の方法(とあなたがサポートしたいHttpRequestBaseの他のサブクラスを)必要がありますを意味します。 GETPOSTの間で共有される共通コードは、両方ともinitialize()メソッドによって呼び出されるより小さなメソッドに抽出する必要があります。

private void initialize(HttpGet method) 
{ 
    // ... 
} 

これは、もちろん、あなたは敗北にGETPOSTの両方のための1つのハンドラを作成しようとしているの全体のポイントを主張するかもしれません。そしてあなたは正しいでしょう。しかし、両方を扱う1つのメソッドを作成しようとする試み全体に疑問を呈してください。おそらく最もエレガントなデザインは、それらを別々に扱うことでしょう。結局のところ、それはあなたが選んだフレームワークの作者が何をするのかとまったく同じです。

+0

2つの分離されたメソッドを作成しました。これは、そのメソッドのコードの90%が同じであるためです。 –

+1

両方のイニシャライザによって呼び出される小さなメソッドで共通の機能をカプセル化します。 – Asaph

+1

あなたはこのコメントであなたの答えを更新することができます。 –

関連する問題