Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 有没有更好的方法来处理向方法传递多个参数_Java_Convenience Methods - Fatal编程技术网

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