对于Android事件,为什么switch语句比if-else链更常见?

时间:2011-01-21 16:35:32

标签: java android performance if-statement switch-statement

开发Android时,switch语句比if-else链更有效吗? switch语句需要更多行代码,但查看轶事证据似乎是Android应用程序中更常用的。

以下示例说明了具有case语句和if-else链的相同编程结构。 switch语句需要10行,而if-else链需要7行。

案例陈述

public void onClickWithSwitch(View v) {
   switch(v.getId()) {
       case R.id.buttonA:
           buttonA();
           break;
       case R.id.buttonB:
           buttonB();
           break;
       case R.id.buttonC:
           buttonC();
   }
}

If-else chain

public void onClickWithIf(View v) {
   int id = v.getId();
   if(id == R.id.buttonA)
       buttonA();
   else if (id == R.id.buttonB)
       buttonB();
   else if (id == R.id.buttonC)
       buttonC();
}

为什么切换比if-else链更常见?与if-else链相比,switch语句能提供更好的性能吗?

5 个答案:

答案 0 :(得分:9)

语言具有switch语句的原因是允许编译器生成跳转表,如果它很大,则跳转快,因为在运行时它可以在O(1)中找到所需的代码,而不是O(N)时间。

如果有很多情况并且在每种情况下执行的代码都不需要花费太多时间,那么它只会在速度方面提供帮助,并且程序在此代码中花费了很多时间。

除此之外,这纯粹是一种品味问题。

代码行数和速度之间没有关系。重要的是生成的汇编语言代码,我鼓励您熟悉它。

答案 1 :(得分:5)

除非你的ifs / case序列确实很大,否则我觉得不重要。通过switch语句,可以更清楚地了解发生了什么。唯一的缺点是所有break语句和错过一个语句的可能性,但静态分析器应该抓住它。

最佳将是由id或一些聪明的子类化

键入的地图

答案 2 :(得分:3)

“效率更高”是一个含糊不清的概念,因为有很多方法可以衡量它。我想大多数人都会想到执行时间。另一方面,大多数人都没有想到内存效率。具有大量间隔测试值的switch语句可能是一个可怕的内存占用,除非编译器足够聪明,可以将其重新解释为if-else链。

对于编程效率,包括维护和可读性,还有很多要说的。正如sblundy指出的那样,switch语句可以更清楚地了解程序员的意图,而不是if-else链。注释可以抵消这种情况,但这需要程序员更多的工作,并且还存在评论和代码不匹配的风险(特别是在几个维护周期之后)。

我想大多数人都会遵循他们所教授的(或被告知要遵循的)任何风格,而不会过多地考虑它。其余的时间,我认为关于switch与if-else的大多数决定都是基于哪一个最符合程序员在生成代码时的想法。

答案 3 :(得分:2)

你问:switch语句真的更有效吗?

任何人声称对这个问题有明确而一般的答案,说废话。在您的情况下,有一种方法可以找出更快的方法:使用完整的软件在目标平台上使用适当的微基准框架,而不是简化示例。如果这表明存在可衡量且具有统计意义的差异,我有兴趣听到它。我怀疑你会发现真正的程序有任何可衡量的差异。

因此,我会严格考虑可读性。

答案 4 :(得分:2)

虽然我们谈到这个主题,但没有人提到你应该 总是 在switch语句中有default行。通常你想抛出异常,但至少你应该断言和/或记录错误。

这只是一个很好的基本防守编程。如果您稍后添加另一个按钮(在这种情况下),它会提醒您有编程错误。