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

时间:2011-04-26 14:39:45

标签: java convenience-methods

我发现自己做了很多事情:

/**
 * 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来在其中添加数据,我想知道是否有更方便的方法来实现这一点?

正如你所看到的,我需要知道密钥和值,所以varargs不起作用(据我所见)。

我对所有想法持开放态度,包括使用反思。

5 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:4)

如果问题在于创建新地图很不方便,对于小地图,您可以使用番石榴ImmutbleMap.of()方法,

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

答案 2 :(得分:3)

我曾经为构建地图编写过这种方便的方法。它需要varargs并成对地制作一张地图。要在测试代码中创建简单的地图,这非常方便。您需要确保获得正确的参数数量,但我喜欢它,因为它会使代码量变小。

@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"));

将pair定义为静态方法,创建包含两个值的简单对象,然后将mapOf转换为Map中的Entries。

答案 3 :(得分:1)

你所做的是正常和普遍的。另一种方法是允许某些参数为null,并在第二种方法中进行一些空值检查。你必须决定你觉得哪种方法不那么难看。

我见过API,其中相同的方法至少有10个这些参数减少的版本,显然没有任何理由。当它像那样气球时,你的设计就会出现问题。在那之前,你对我的看法很好,虽然我不太喜欢Map实例化。

答案 4 :(得分:1)

我会说这是一个非常普遍的方法。

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

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

然后致电

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

请注意,这使用了varargs,但使用起来并不安全(您可以传递长度为1或甚至为0的数组)。