1

私は Wicket アプリケーションを開発しています。しかし、私の質問は実際には Wicket 関連ではありません。そのアプリには、水平メニューがあります。このメニューは、いくつかのリンクで作成されています。リンクをクリックすると、いくつかのページに移動します。現在表示しているページに基づいて、メニューのリンクの css クラス属性が「選択済み」に変更されます。これが問題の説明です。

現在、整数値を使用してこの問題を解決しています。値はセッションに保存され、いずれかのリンクがクリックされると更新されます。その保存された値に基づいて、どのリンクが「選択」されるかが実行時に決定されます。

これを次の方法で実装しています。

//On link click I set a number in session

public void onClick() {
    session.setValue(1);// or 2 or 3
}

メニューが作成されたら、次のように値を切り替えて css クラスを変更します。

switch(session.getValue){
    case 1: add css to home;
    case 2: add css to profile;
    // and so on.
}

これが唯一の正しい方法だと思っていましたか?または、これをより良い方法で達成するのに役立つ他の優れた手法や設計パターンが存在しますか?

4

4 に答える 4

4

メニュー項目を配列 (または ArrayList) に格納します。

items[0] = home
items[1] = profile

そして、配列のインデックスをメニュー識別子として使用します。選択したメニュー識別子を受け取ったら、対応するアイテムを取得します

items[selectedItem]

識別子が数字でない場合、または 0 から N にならない場合は、Map を使用することもできます。

于 2012-05-05T20:40:35.397 に答える
2

まず、enumマジック ナンバー (1、2、3) の代わりにまたは静的定数を使用します。

于 2012-05-05T20:38:46.817 に答える
1

Visitor パターンは、この種の切り替えを回避するために一般的に使用されます。あなたのケースでは完全なパターンを実装したくないかもしれませんが、知っておく価値はあります。JB Nizet の答えは、あなたの状況ではより実用的かもしれません。

https://en.wikipedia.org/wiki/Visitor_patternを参照してください

これらのSOの質問もいくつかのアイデアを与えるかもしれません

instanceof スイッチの代わりの Java ビジター パターン

Java Enums - Switch ステートメントと Enums のビジター パターン - パフォーマンスの利点は?

于 2012-05-05T20:40:49.623 に答える
0

列挙型と列挙型をキーとして使用して実装しました。列挙型を定義しました:

public enum NavigationStatus {
    HOME,
    PROFILE;
}

セッションでは、現在のナビゲーションの値を次のように設定しました。

private NavigationStatus activeUserNavigationStatus;

public NavigationStatus getActiveUserNavigationStatus() {
    return activeUserNavigationStatus;
}

public void setActiveUserNavigationStatus(NavigationStatus activeUserNavigationStatus) {
    this.activeUserNavigationStatus = activeUserNavigationStatus;
}

主に私はそれを次のように設定しました:setActiveUserNavigationStatus(NavigationStatus.HOME);

メニューが作成されているところで、EnumMapを作成しました。

EnumMap<NavigationStatus, Component[]> menuMap = new EnumMap<NavigationStatus, Component[]>(NavigationStatus.class);

そしてそれに要素を追加しました:

menuMap.put(NavigationStatus.HOME, new Component[] { homeContainer, home });

また、リンクのクリックメソッドでステータス値を設定します。

public void onClick() {
    session.setActiveUserNavigationStatus(NavigationStatus.PROFILE);
}

最後に、セッションから現在の値を確認し、それに応じてcssクラスを設定しました。

Component[] menuComponents = menuMap.get(getSession().getActiveUserNavigationStatus());
menuComponents[0].add(new AttributeAppender("class", new Model<Serializable>(" active")));
menuComponents[1].add(new AttributeAppender("class", new Model<Serializable>(" active")));

これはswitchステートメントなしで、JBNizetのArrayListインデックスとOliCharlesworthの列挙型のアイデアを組み合わせたものです。

ありがとうございました。

于 2012-05-05T22:05:31.330 に答える