如何通过多态性消除这个特定的SWITCH语句

时间:2015-05-10 14:54:18

标签: java android

我有这个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();
    }
}

1 个答案:

答案 0 :(得分:5)

在Action类中添加抽象方法execute(),创建4个Action子类,覆盖execute()。使第一个执行openEditProductScreen(),第二个执行startDeleteProductOperation()等等。

然后创建这4个类的一个实例,并让用户选择这4个实例中的一个。 当用户选择了该操作后,请致电selectedAction.execute()

你应该用多态替换这种开关吗?在我看来:是的。当你必须添加另一个动作时,你将无法忘记在新的子类中实现execute()方法:没有它你的代码将无法编译。另一方面,忘记在switch语句中添加一个case非常容易。我甚至没有提到switch语句的漏洞问题。