2017-02-15 70 views
2

我正在編寫將與HttpGet和HttpPost一起使用的函數。 這是類似的東西:Java 8 HttpClient 4.5在一個函數中的HttpGet和HttpPost

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

問題是,HttpRequestBase不支持.setEntity。我該如何編寫支持HttpGet和HttpPost的函數,而沒有這樣的問題?

+1

你知道你的if條件永遠不會是真的,不是嗎?與新對象相比,任何現有的對象引用都將返回「false」。 – RealSkeptic

+0

哦,你說得對。任何方法? –

+0

'if(method instanceof 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一個處理程序的整點。你會是對的。但是,您應該質疑嘗試創建一種處理兩者的方法的整個練習。也許最優雅的設計是分別對待它們。畢竟,這正是您使用的框架的作者選擇做的。

+0

創建兩個分離的方法 - 這是我想避免的,因爲該方法中的代碼的90%將是相同的 –

+1

在由兩個初始化程序調用的較小方法中封裝通用功能。 – Asaph

+1

你可以用這個評論來更新你的答案。 –