在Java中编写Object的大型if-else语句的最佳方法?

时间:2013-02-21 22:45:11

标签: java swing if-statement hashmap

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

3 个答案:

答案 0 :(得分:11)

我会使用多态:

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

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

答案 1 :(得分: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?");
    }
}

答案 2 :(得分:2)

您可以使用包含50个项目的地图,键入不同的treenode(或treenode名称),并返回可在节点上执行的“操作”吗?

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

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

要么treenodes需要正确地实现equals和hashcode ......或者你可以只使用节点名称(假设它是唯一的)。

祝你好运!