0

私は Swing を使用しており、GUI に JTree があります。実行中は、ツリーのノードを解析して、実行するアクションを決定します。ここにスニペットがあります:

// action to modify node
public void modifyMenuItem(DefaultMutableTreeNode node)
{
// if node is node 1 in the tree
if(node.equals(treeNodes.node1))
    {
        // perform action 1 
}

 // if node is node 2 in the tree
    else if(node.equals(treeNodes.node2))
    {
        // perform action 2
    }

 // if node is node 3 in the tree
    else if(node.equals(treeNodes.node3))
    {
        // perform action 3
    }
    etc.
}

問題は、ツリーに 50 近くのノードがあり、このタイプの実装によってパフォーマンスが大幅に低下しているのではないかと心配していることです。コード全体に同様の if ステートメントがあります。このようなオブジェクトの大きな if ステートメントを処理するための推奨される方法は何ですか? これらは整数値ではないため、明らかに switch ステートメントを使用できません。ハッシュマップを作成してから、ハッシュ キーに基づいてスイッチを使用する必要がありますか?

4

3 に答える 3

11

私はポリモーフィズムを使用します:

public void modifyMenuItem(DefaultMutableTreeNode node) {
    ((MyUserObject) node.getUserObject()).doAction();
}

MyUserObjectこれが機能するには、ノードのすべてのユーザー オブジェクトが同じインターフェイスのインスタンスである必要があります。

于 2013-02-21T22:50:19.560 に答える
3

何をしようとしているのかよくわからないので、ポリモーフィズムを使用することをお勧めします。DefaultMutableTreeNodeあなたのインターフェースも実装する のサブクラスを作成し、それActionPerfomerを method で呼び出しましょうperformAction()。これらのクラスのインスタンスをツリーのノードとして使用すると、次のように簡単に記述できます。

// I suppose you can't change the signature?
public void modifyMenuItem(DefaultMutableTreeNode node) {
    if (node instanceof ActionPerfomer) {
        ActionPerfomer ap = (ActionPerfomer) node;
        ap.performAction();
    } else {
        logger.log("How did that get here?");
    }
}
于 2013-02-21T22:51:30.023 に答える
2

異なるツリーノード (またはツリーノード名) をキーとして、ノードで実行できる「アクション」を返す 50 個のアイテムを含むマップを使用できますか?

Map<String, Action> map = new HashMap<String, Action>();
// populate the map with items and Actions

Action action = map.get(node.getName());
action.perform(node);

ツリーノードは equals と hashcode を正しく実装する必要があります... またはノード名を使用することもできます (一意である場合)。

幸運を!

于 2013-02-21T22:51:51.650 に答える