3

私は自分自身が次のことをたくさんやっていることに気づきました:

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

2番目のメソッドを呼び出すには、実際にハッシュマップを作成してデータを追加する必要がありますが、これを実現するためのより便利な方法があるかどうか疑問に思っていましたか?

ご覧のとおり、キーと値の両方を知る必要があるため、varargs は機能しません (私が見る限り)。

リフレクションの使用を含め、あらゆるアイデアを受け入れます。

4

5 に答える 5

4

問題が新しいマップを作成するのが面倒である場合、小さなマップの場合、グアバのImmutbleMap.of()メソッドを使用できます。

ImmutableMap.of("key1", "value1", "key2", "value2");
于 2011-04-26T14:55:50.217 に答える
4

なぜ新しいマップを作成する必要があるのですか? redirectnull を渡してから、2 番目のメソッドで null マップをチェックできると思います。とにかく null をチェックすることはおそらく良い考えです。

于 2011-04-26T14:49:30.927 に答える
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"));

ペアを、2つの値を含む単純なオブジェクトを作成する静的メソッドとして定義し、次にそれらのペアをマップのエントリに変換するmapOfを定義します。

于 2011-04-26T14:56:34.580 に答える
1

あなたがしたことは正常で一般的です。別の方法として、一部のパラメーターを null にすることを許可し、2 番目のメソッドで null チェックを行うこともできます。どちらのアプローチの方が醜くないと感じるかを決める必要があります。

同じメソッドにこれらのパラメーターが削減されたバージョンが少なくとも 10 ある API を見たことがありますが、明らかに理由はまったくありません。このように膨らむと、デザインに大きな問題があります。Mapそれまでは、インスタンス化があまり好きではありませんが、あなたが持っているものは私にはうまく見えます.

于 2011-04-26T14:52:37.217 に答える
1

それはかなり一般的なアプローチだと思います。

私が現在考えることができる唯一の他の(完全ではない)便利な方法は次のとおりです。

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

それから電話する

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

これは varargs を使用しますが、安全に使用できないことに注意してください (長さ 1 または 0 の配列を渡すこともできます)。

于 2011-04-26T14:53:26.063 に答える