【问题标题】:Is there a better way to handle passing in multiple parameters to methods有没有更好的方法来处理将多个参数传递给方法
【发布时间】:2011-04-26 14:39:45
【问题描述】:

我发现自己经常做以下事情:

/**
 * 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 不起作用(据我所知)。

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

【问题讨论】:

  • 我认为您为自己找到了“最先进”的解决方案
  • 这是一个非常不方便的解决方案。
  • 我觉得多写 3 行代码没那么极端……
  • 切换到 C# 4.0 或 JavaScript。他们对这种模式有一个非常方便的符号......
  • @Lukas Eder - 这与 3 行额外的代码无关,请考虑在每次调用时执行的迭代以及内存消耗(顺便说一下,您使用字符串连接从而创建了很多您要丢弃的临时字符串——考虑使用 StringBuilder 代替吗?)

标签: java convenience-methods


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    如果问题是新建地图比较麻烦,小地图可以使用guavaImmutbleMap.of()方法,

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

    【讨论】:

      【解决方案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 中的条目。

      【讨论】:

      • 刚刚看到 Guava ImmutableMap.of() 答案 (+1)。当我写上面的时候,我不知道那是在 API 中。
      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

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

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

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

        然后调用

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-06-29
          • 1970-01-01
          • 2019-03-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-11-09
          相关资源
          最近更新 更多