2011-04-26 92 views
3

我發現自己做了以下很多:有沒有更好的方式來處理多個參數傳遞給方法

/** 
* Redirect to a MVC controller&action 
* @param controller 
* @param action 
*/ 
public void redirect(String controller, String action) { 
    redirect(controller, action, new HashMap<String, String>()); 
} 
/** 
* Redirect to a MVC controller&action with extra URL parameters 
* @param controller 
* @param action 
* @param data 
*/ 
public void redirect(String controller, String action, Map<String, String> data) { 
    String urlParameters = ""; 
    for(String key : data.keySet()) { 
     urlParameters += "&" + key + "=" + data.get(key); 
    } 
    m_binder.putLocal("RedirectParams", "IdcService=MVC_FRONTCONTROLLER&controller="+controller+"&action="+action + urlParameters); 
} 

要調用第二種方法其實我需要創建一個HashMap在其添加數據和我想知道是否有更方便的方法來實現這一目標?你可以看到我需要知道關鍵字和值,所以可變參數不起作用(據我所知)。

我接受所有想法,包括使用反思。

+0

我認爲你得到了自己的「最先進的」解決方案 – 2011-04-26 14:42:52

+0

儘管這是一個非常不方便的解決方案。 – Peeter 2011-04-26 14:43:35

+0

我不認爲寫3行額外的代碼是如此極端...... – 2011-04-26 14:43:58

回答

3

我寫了這個便利方法構建一個同時映射回。它需要可變參數併成對出圖。爲了在測試代碼中創建簡單的地圖,這非常方便。你需要確保你得到的參數數量正確,但我喜歡它,因爲它使代碼量更小。

@SuppressWarnings("unchecked") 
public static <K, V> Map<K, V> mapOf(K key, V value, Object... morePairs) { 
    Map<K, V> map = new HashMap<K, V>(); 
    map.put(key, value); 
    for (int i=0; i<morePairs.length; i+=2) { 
     map.put((K)morePairs[i], (V)morePairs[i+1]); 
    } 
    return map; 
} 

然後你就可以使用創建地圖:

Map<String, String> map = mapOf("One", "1", "Two", "2"); 

這不是茶,每個人的杯子(然而由於缺乏類型安全的),所以你可以改變的實施,採取對:

Map<String, String> map = mapOf(pair("One", "1"), pair("Two", "2")); 

將對定義爲一個靜態方法,該方法創建一個包含兩個值的簡單對象,然後mapOf將這些對轉換爲Map中的條目。

+0

剛剛看到Guava ImmutableMap.of()回答(+1)。當我寫上述內容時,我不知道這是API。 – alpian 2011-04-26 14:57:51

4

爲什麼你必須創建一個新的地圖?我想你可以傳入null,然後在第二個redirect方法中檢查空映射。無論如何,檢查空值可能是一個好主意。

1

你所做的是正常的和常見的。另一種方法是允許某些參數爲空,並在第二種方法中執行一些空值檢查。你將不得不決定你覺得哪種方法不難看。

我已經看到APIs,其中至少有10個這些參數簡化版本的顯然沒有理由。當它像那樣放氣時,你的設計出現了一些問題。在那之前,你看起來對我來說很好,儘管我並不很喜歡這個例子。

1

我會說這是一個相當普遍的問題。

其他唯一的(不完全),方便我目前能想到的方法是:

public void redirect(String[]... params) 
{ 
    //build the query string 
} 

然後調用

redirect(new String[][]{{"a","1"}, {"b", "2"}}); 
redirect(); 

注意,這裏使用的可變參數,但它並不完全安全使用(你可以傳遞長度爲1或甚至0的數組)。

4

如果問題是,它是尷尬創建一個新的地圖,適用於小地圖,你可以使用番石榴ImmutbleMap.of()方法,

ImmutableMap.of("key1", "value1", "key2", "value2"); 
+0

+1這看起來不錯! – 2011-04-26 15:45:39

相關問題