有没有更好的方式来处理多个参数传递给方法
我发现自己做了以下很多:有没有更好的方式来处理多个参数传递给方法
/**
* 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在其添加数据和我想知道是否有更方便的方法来实现这一目标?你可以看到我需要知道关键字和值,所以可变参数不起作用(据我所知)。
我接受所有想法,包括使用反思。
我写了这个便利方法构建一个同时映射回。它需要可变参数并成对出图。为了在测试代码中创建简单的地图,这非常方便。你需要确保你得到的参数数量正确,但我喜欢它,因为它使代码量更小。
@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中的条目。
刚刚看到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");
+1这看起来不错! – 2011-04-26 15:45:39
我认为你得到了自己的“最先进的”解决方案 – 2011-04-26 14:42:52
尽管这是一个非常不方便的解决方案。 – Peeter 2011-04-26 14:43:35
我不认为写3行额外的代码是如此极端...... – 2011-04-26 14:43:58