有没有更好的方式来处理多个参数传递给方法

问题描述:

我发现自己做了以下很多:有没有更好的方式来处理多个参数传递给方法

/** 
* 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

我写了这个便利方法构建一个同时映射回。它需要可变参数并成对出图。为了在测试代码中创建简单的地图,这非常方便。你需要确保你得到的参数数量正确,但我喜欢它,因为它使代码量更小。

@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

为什么你必须创建一个新的地图?我想你可以传入null,然后在第二个redirect方法中检查空映射。无论如何,检查空值可能是一个好主意。

你所做的是正常的和常见的。另一种方法是允许某些参数为空,并在第二种方法中执行一些空值检查。你将不得不决定你觉得哪种方法不难看。

我已经看到APIs,其中至少有10个这些参数简化版本的显然没有理由。当它像那样放气时,你的设计出现了一些问题。在那之前,你看起来对我来说很好,尽管我并不很喜欢这个例子。

我会说这是一个相当普遍的问题。

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

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

然后调用

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

注意,这里使用的可变参数,但它并不完全安全使用(你可以传递长度为1或甚至0的数组)。

如果问题是,它是尴尬创建一个新的地图,适用于小地图,你可以使用番石榴ImmutbleMap.of()方法,

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

+1这看起来不错! – 2011-04-26 15:45:39