Есть ли лучший способ обработки передачи нескольких параметров в методы - PullRequest
3 голосов
/ 26 апреля 2011

Я часто выполняю следующие действия:

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

Чтобы вызвать второй метод, мне действительно нужно создать хэш-карту для добавления в него данных, и мне было интересно, есть ли более удобный способдостижения этого?

Как видите, мне нужно знать и ключ, и значение, чтобы varargs не работали (насколько я вижу).

Я открыт для всех идей,в том числе с использованием отражения.

Ответы [ 5 ]

4 голосов
/ 26 апреля 2011

Если проблема в том, что создавать новую карту неудобно, для небольших карт вы можете использовать методы guava ImmutbleMap.of () ,

ImmutableMap.of("key1", "value1", "key2", "value2");
4 голосов
/ 26 апреля 2011

Почему вы должны создать новую карту? Я полагаю, вы могли бы просто передать нулевое значение, а затем проверить на нулевую карту в вашем втором redirect методе. В любом случае, это хорошая идея, чтобы проверить на ноль.

3 голосов
/ 26 апреля 2011

Я написал этот удобный метод для построения карт некоторое время назад.Он берет 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"));

Где вы определяете пару как статический метод, который создает простой объект, содержащийдва значения, а затем mapOf, который преобразует эти пары в записи на карте.

1 голос
/ 26 апреля 2011

Я бы сказал, что это довольно распространенный подход.

Единственный другой (не совсем) удобный метод, о котором я сейчас могу подумать, будет:

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

, затем вызовите

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

Обратите внимание, что здесь используются переменные, но они не совсем безопасны (вы можете передавать массивы длиной 1 или даже 0).

1 голос
/ 26 апреля 2011

То, что вы сделали, является нормальным и обычным делом.Альтернатива состоит в том, чтобы позволить некоторым параметрам быть нулевыми и выполнить некоторую нулевую проверку во втором методе.Вам придется решить, какой подход вы считаете менее уродливым.

Я видел API, в которых тот же метод имеет по крайней мере 10 из этих версий с уменьшенным параметром, по-видимому, без всякой причины.Когда он так раздувается, в вашем дизайне что-то не так.До тех пор то, что у вас есть, выглядит хорошо для меня, хотя мне не очень нравится инстанцирование Map.

...