Java 有没有更好的方法来处理向方法传递多个参数
我发现自己经常做以下事情:Java 有没有更好的方法来处理向方法传递多个参数,java,convenience-methods,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 t
/**
* 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);
}
/**
*重定向到MVC控制器&操作
*@param控制器
*@param动作
*/
公共无效重定向(字符串控制器、字符串操作){
重定向(控制器、操作、新HashMap());
}
/**
*重定向到MVC控制器&带有额外URL参数的操作
*@param控制器
*@param动作
*@param数据
*/
公共无效重定向(字符串控制器、字符串操作、映射数据){
字符串url参数=”;
for(字符串键:data.keySet()){
urlParameters+=“&”+key+“=”+data.get(key);
}
m_binder.putLocal(“重定向参数”,“IdcService=MVC_FRONTCONTROLLER&controller=“+controller+”&action=“+action+urlParameters”);
}
要调用第二个方法,我实际上需要创建一个hashmap来在其中添加数据,我想知道是否有更方便的方法来实现这一点
正如您所见,我需要知道键和值,因此varargs无法工作(据我所知)
我对所有想法都持开放态度,包括使用反射 为什么要创建新地图?我想您可以传入null,然后在第二个
重定向
方法中检查null映射。不管怎样,检查null可能是个好主意。您所做的是正常和常见的。另一种方法是允许某些参数为null,并在第二种方法中执行一些null检查。你必须决定哪种方法你觉得不那么难看
我见过一些API,其中相同的方法至少有10个这样的参数缩减版本,显然没有任何理由。当它像那样膨胀时,你的设计有很大的问题。在那之前,我觉得你所拥有的一切都很好,尽管我并不太喜欢
映射的实例化。我认为这是一种非常常见的方法
我目前唯一能想到的另一种(不是很方便的)方法是:
public void redirect(String[]... params)
{
//build the query string
}
然后打电话
redirect(new String[][]{{"a","1"}, {"b", "2"}} );
redirect();
请注意,这使用了varargs,但使用起来不太安全(您可以传递长度为1甚至0的数组)。如果问题是创建新地图很难,对于小地图,您可以使用guava方法
不久前,我为构建地图编写了这个方便的方法。它需要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;
}
@SuppressWarnings(“未选中”)
公共静态映射映射(K键、V值、对象…更多对){
Map Map=newhashmap();
map.put(键、值);
对于(int i=0;我认为你拥有“最先进的技术”解决方案这是一个非常不方便的解决方案。我不认为写3行额外的代码是如此极端…切换到C#4.0或JavaScript。他们有一个非常方便的符号来精确描述这个模式…@Lukas Eder——这不是关于3行额外的代码,想想每次调用执行的迭代以及内存消耗(顺便说一句,您正在使用字符串连接,从而创建了许多临时字符串,您正在丢弃这些字符串--考虑改用StringBuilder吗?)刚才看到了Guava ImmutableMap.of()答案(+1)。我在编写上述内容时不知道API中有这一点。
@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"));