我发现自己做了很多事情:
/**
* 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不起作用(据我所见)。
我对所有想法持开放态度,包括使用反思。
答案 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的数组)。