2014-11-24 74 views
3

我愿做这样的事情:Switch语句,使默认的一个早期定义的开关情况?

int i = 0; 

switch(difficulty) { 
    case 1: i++; break; 
    case 2: i--; break; 
    default: case 1; 
} 

是这样的可能吗?我想防止重复的代码。我知道在这个特定的例子中,没有什么理由要这样做,因为重复的代码很小。我能想出的唯一的事情是这样的[使用告吹的开关情况的能力]:

switch(difficulty) { 
    case 2: i--; break; 
    default: 
    case 1: i++; break; 
} 

我宁愿不做这样的,因为它会更有意义,增加案件数量和在底部有默认值。

但是我想知道如果我能做到这一点,它会搞不清引擎盖下的goto语句吗?特别是,从数字或乱序之后决定使用哪个goto语句不需要更长的时间?订单在switch语句中是否重要?想象一下,所有的情况都有被调用的可能性,如果你以随机顺序而不是线性顺序来处理它们,那么它会起作用吗?

[编辑:关于效率,我发现我这方面的问题:是否开关语句的顺序事情,简单的答案是否定的:Does switch case order affect speed? How does Java's switch work under the hood?

+0

goto?请不! – 2014-11-24 16:07:00

+4

为什么不删除案例1:并保持默认?默认意味着所有其他值 - 如果未在别处定义,则包括1。 – BarrySW19 2014-11-24 16:07:28

+2

添加一个私有方法,并从'case 1'和'default'调用它,这样你就不会有重复的代码。 – 2014-11-24 16:11:08

回答

4

这可能是你需要/想要的东西,而且是有效的代码

int i = 0;  
    switch (difficulty) { 
    default: 
    case 1: i++; break; 
    case 2: i--; break; 
    } 
+0

我认为这一定是做我想做的最好的方式。只有默认所在的地方被更改,而不是案件。如果我可以将默认值保留在底部,这将会更好,但是这种折衷比重新排列顺序特别有意义的情况更好。谢谢! – Joop 2014-11-24 16:18:42

10

这应该满足您的需求:

switch(difficulty) { 
    case 2: i--; break; 
    default: i++; break; 
} 
+0

这不是我想知道的。想象一下你有3个关卡,每个关卡3个。而且你想保持这些关卡的线性顺序,因为这样做会合乎逻辑。你可以做这样的事情而不改变线性顺序吗? – Joop 2014-11-24 16:10:38

0

没有,在switch语句顺序无关紧要的。 此外,编译器始终维护一个用于跳转到switch语句的散列表。所以订购或增加套管根本不是问题。它总是一个O(1)操作。 然而,这将降低开关为您的情况:

switch(difficulty) { 
    case 2: i--; break; 
    default: i++; break; 
} 
+1

“*编译器总是维护一个用于跳转到switch语句的散列表。*”=>不总是,不。 – assylias 2014-11-24 16:20:47

+0

@Tanjeer - 请参阅https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-3.html#jvms-3.10 - 切换可以通过索引或通过表格搜索来实现。 – 2014-11-24 16:23:43

+0

[This answer](http://stackoverflow.com/a/12938176/2991525)解释说你的O(1) - 声明是错误的。 – fabian 2014-11-24 16:29:18

1

(从评论感动,因为它似乎是有帮助的)

添加一个私有方法,并从两个case 1default,这样叫它你将不会有重复的代码。

相关问题