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);
}

要调用第二种方法,我实际上需要创建一个哈希图来在其中添加数据,我想知道是否有更方便的方法来实现这一点?

如您所见,我需要知道键和值,因此可变参数不起作用(据我所知)。

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

4

5 回答 5

4

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

于 2011-04-26T14:49:30.927 回答
4

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

ImmutableMap.of("key1", "value1", "key2", "value2");
于 2011-04-26T14:55:50.217 回答
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"));

您将 pair 定义为静态方法,该方法创建一个包含两个值的简单对象,然后 mapOf 将这些对转换为 Map 中的条目。

于 2011-04-26T14:56:34.580 回答
1

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

我已经看到 API,其中相同的方法至少有 10 个这些参数减少的版本,显然完全没有理由。当它像那样膨胀时,你的设计就有很大的问题。在那之前,你所拥有的对我来说看起来不错,尽管我不太喜欢Map实例化。

于 2011-04-26T14:52:37.217 回答
1

我会说这是一种很常见的方法。

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

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

然后打电话

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

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

于 2011-04-26T14:53:26.063 回答