【发布时间】:2019-08-21 06:38:15
【问题描述】:
今天我用 Java 制作了一个俄罗斯方块克隆,到了实现块生成机制的时候,我写了这个带有枚举的 switch 语句。有人告诉我尽可能避免使用 switch 语句,但我不确定是否可以在此处避免使用 switch 语句,除非我彻底检查我最初的基于继承的设计选择。
为了实现不同类型的块,我决定创建一个名为 Block 的抽象超类,并为每个特定类型创建一个子类。我还制作了一个标记块类型的枚举。例如,ZBlock extends Block 对象会将 Type.ZBlock 枚举分配给其 Type 字段变量。
private void spawnBlock(Type type){
switch(type){
case I:
currentBlock = new IBlock();
break;
case L:
currentBlock = new LBlock();
break;
case J:
currentBlock = new JBlock();
break;
case Z:
currentBlock = new ZBlock();
break;
case S:
currentBlock = new SBlock();
break;
case T:
currentBlock = new TBlock();
break;
default:
currentBlock = new OBlock();
}
}
当我开始考虑在此处不使用 switch 语句的方法时,除了摆脱所有子类并在单个非抽象 Block 类中对不同块的行为进行编程之外,我想不出别的办法.但它可能会变得一团糟,因为不同的块有不同的形状和墙踢数据。那么 switch 语句在这里是一个不错的选择吗?如果没有,我该如何改进我的代码?为什么?
【问题讨论】:
-
“我被告知要尽可能避免使用 switch 语句”。这根本不是真的。
-
@Sweeper 本来可以告诉他的,但是告诉他的人并没有告诉他好东西。
-
OP,
switch可以 -
为什么不合适?我看到的直接替代方案是很多 if else if,这只会创建混乱的代码。只是不要忘记:switch 不会做空检查
-
“尽可能避免 switch 语句” 无疑是“……为愚者的服从和智者的指导”的规则之一。你不应该不惜一切代价避免它们。但是,在许多的情况下,
switch-statements(甚至经常是if-statements)在引用任何类型的type时都应该仔细查看。 i>,如switch(type)或if(type==X)。这当然是一个危险信号,应该仔细考虑是否不能更恰当地用多态来解决(这里基本上也是这种情况)。
标签: java oop switch-statement