我正在使用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键的开关吗?
答案 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 ......或者你可以只使用节点名称(假设它是唯一的)。
祝你好运!