我有这个switch语句,在用户显示要执行的操作列表并单击其中一个之后执行。我们打开的是动作ID
switch (actionId) {
case 0:
openEditProductScreen();
break;
case 1:
startDeleteProductOperation();
break;
case 2:
//nothing
break;
case 3:
openAddProductScreen();
break;
}
我已经阅读了一些关于用多态替换开关的文章,但它们与另一种类型的问题有关 - 以不同的方式做同样的事情(你支付不同类型的员工的方式),但是当我想要触发时我该怎么办一组完全不同的行动?
考虑一下,我真的需要消除这种特殊的切换声明吗?我的意思是,它具有可读性和逻辑性。如果我以某种方式消除它会带来什么好处?
编辑:
这是你的意思吗?
private Map<Integer, ProductRelatedAction> productRelatedActions = new HashMap<Integer, ProductRelatedAction>();
private void mapActionsToIds() {
productRelatedActions.put(0, new EditProductAction());
productRelatedActions.put(1, new DeleteProductAction());
// remainder omitted
}
private abstract class ProductRelatedAction{
abstract void execute();
}
private class EditProductAction extends ProductRelatedAction{
@Override
void execute() {
openEditProductScreen();
}
}
private class DeleteProductAction extends ProductRelatedAction{
@Override
void execute() {
startDeleteProductOperation();
}
}
答案 0 :(得分:5)
在Action类中添加抽象方法execute()
,创建4个Action子类,覆盖execute()
。使第一个执行openEditProductScreen()
,第二个执行startDeleteProductOperation()
等等。
然后创建这4个类的一个实例,并让用户选择这4个实例中的一个。
当用户选择了该操作后,请致电selectedAction.execute()
。
你应该用多态替换这种开关吗?在我看来:是的。当你必须添加另一个动作时,你将无法忘记在新的子类中实现execute()
方法:没有它你的代码将无法编译。另一方面,忘记在switch语句中添加一个case非常容易。我甚至没有提到switch语句的漏洞问题。