当前位置: 首页 > 面试题库 >

使多态性无法解决那些switch / case语句的麻烦

蒋航
2023-03-14
问题内容

继续前面的问题,我实现了基本的命令模式,创建了命令类并编码到接口,因此在使用任何命令时都可以调用该execute()方法。

但是,我仍然发现自己无法动摇这些案例陈述:我正在从主/决策字符串(由随机,重复的字符A,B,C或D组成)中读取每个字符,然后检索相关的实现地图上的命令,然后调用其execute方法。

我的设计是这样的:

public interface Command {
    void execute();
}

public class CommandA implements Command{
  //implements execute() method
}

private Map myMap= new HashMap();
myMap.put("A", new CommandA);
myMap.put("B", new CommandB);
myMap.put("C", new CommandC);
myMap.put("D", new CommandD);

但是,当我阅读每条指令时,我又不得不求助于case语句:

switch(instructionFromString){
case 'A':{myMap.get("A").execute(); break;}
case 'B':{myMap.get("B").execute(); break;}
case 'C':{myMap.get("C").execute(); break;}
case 'D':{myMap.get("D").execute(); break;}

显然,在此过程中,我设法克服了针对案例陈述的多态性优势。

可能是我选择用来存储命令的数据结构吗?仅从中提取这些命令就可以成为永久数据结构。

我想到的另一件事是我在地图中使用的键/值命名。我试图在概念上将每个存储的命令链接到其相关指令的方式?即,命令“ A”的实现通过键“
A”存储在地图上,以便它可以与相应的指令“ A”匹配?在我看来,这似乎不太可能。

对于我下一步将一劳永逸地删除这些案例陈述的任何提示或进一步建议,将不胜感激。提前谢谢了


问题答案:

我可能在这里遗漏了一些东西,但不是switch声明,而是怎么了

((Command)myMap.get(instructionFromString)).execute();

如果structionalFromString是a
char,则String在进行地图查找之前将其转换为,否则请使用Character地图中的键。

另外,如果您使用Java 5通用映射,则可以将强制转换为Command。清理后的版本为:

private Map<Character, Command> myMap = new HashMap<Character, Command>();
myMap.put('A', new CommandA());
myMap.put('B', new CommandB());
myMap.put('C', new CommandC());
myMap.put('D', new CommandD());

其次是:

char instructionFromString = ....
myMap.get(instructionFromString).execute();


 类似资料:
  • 主要内容:switch 语句格式,嵌套 switch 语句,if 语句和 switch 语句的区别if…else 语句可以用来描述一个“二岔路口”,我们只能选择其中一条路来继续走,然而生活中经常会碰到“多岔路口”的情况。 switch 语句提供了 if 语句的一个变通形式,可以从多个语句块中选择其中的一个执行。 switch 语句格式 switch 语句是 Java 的多路分支语句。它提供了一种基于一个表达式的值来使程序执行不同部分的简单方法。因此,它提供了一个比一系列 if-else-if

  • C语言虽然没有限制 if else 能够处理的分支数量,但当分支过多时,用 if else 处理会不太方便,而且容易出现 if else 配对出错的情况。例如,输入一个整数,输出该整数对应的星期几的英文表示: 运行结果: Input integer number:3↙ Wednesday 对于这种情况,实际开发中一般使用 switch 语句代替,请看下面的代码: 运行结果: Input integ

  • 很多时候 if 语句可以很好的满足我们对于分支控制的需求,但是当你要对于一系列有着相同表达式不同内容的东西分类的时应该怎么办?这正式今天要介绍的内容。 1. 语法 switch (表达式) { case 常量1: 语句1 break; case 常量2: 语句2 break; . . . defa

  • 我正在为班级做一个项目,我们的任务是设计一个包含5个选项的计算器程序。如果用户输入的选项不在1和5之间,当我试图编码以捕获时,我面临一个问题。当前,如果用户输入6到9之间的数字。第一次捕获异常时,将显示一条错误消息,提示输入1到5之间的选项,并显示一条重新输入的消息。但是,如果用户继续输入6到9之间的数字,则不会显示错误消息,并显示主菜单。我还试图捕捉输入字符串而不是1和5之间的选择,并显示不同的

  • 问题内容: 我正在尝试创建一个switch语句,但似乎无法使用被求值的表达式(而不是设置的字符串/整数)。我可以轻松地使用if语句来执行此操作,但希望大小写应该更快。 我正在尝试以下 我缺少明显的东西吗?Google在这种情况下并不友好。 任何帮助/指针表示赞赏 问题答案: 你总是可以做 它之所以有效是因为它是一个常量,因此将执行第一个case语句下带有计算结果为true的表达式的代码。 我猜这有

  • 好吧,冒着被嘲笑没有“更努力”的风险,我有一个场景,我一直在尝试适应一个pythonic switch案例陈述。我知道python在3.10中有新的方法,但在我的AWS用例中我仅限于3.8.10。我一直在阅读其他语言中的switch case,我想找到一种pythonic方法,将下面混乱的语句转换为干净的switch case。我想知道在这种情况下其他人会怎么做 目标:我有一个文件名,该文件名将被