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 语句,因为这些不是整数值,所以我应该创建一个 Hashmap 然后使用基于 Hash 键的开关吗?

4

3 回答 3

11

我会使用多态性:

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

为此,节点的所有用户对象都必须是同一MyUserObject接口的实例。

于 2013-02-21T22:50:19.560 回答
3

不知道更多你想要做什么,我建议你使用多态性。您创建的子类DefaultMutableTreeNode也实现了您的接口,让我们ActionPerfomer用方法来调用它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 回答