为什么Android不使用更多枚举?

时间:2011-01-27 22:49:50

标签: android enums

我开始非常喜欢在代码中使用C#和Java枚举,原因如下:

  • 它们比整数,字符串或布尔标志集更加类型安全。
  • 它们会带来更易读的代码。
  • 将枚举设置为无效值比使用int或字符串更难。
  • 它们可以轻松发现变量或参数的允许值。
  • 我读过的所有内容都表明它们的性能与C#和大多数JVM中的整数一样好。

然而,Android框架有很多情况需要传递各种类型的标志,但它们似乎都没有使用枚举。我认为其使用有益的几个例子是Toast.LENGTH_SHORT / Toast.LENGTH_LONGView.GONEView.VISIBLE等。

这是为什么?在Dalvik中,枚举的性能是否比简单的整数值差?还有其他一些我不知道的缺点吗?

3 个答案:

答案 0 :(得分:65)

截至2011年3月,此答案已过期。

可以在Froyo及以上使用枚举 - 根据Android VM团队成员(以及Why was “Avoid Enums Where You Only Need Ints” removed from Android's performance tips?)的答案(his blog)。


上一个答案:

官方Android团队的建议是,只要你能避免它就避免使用枚举:

  

枚举非常方便,但是   不幸的是,当大小时可能会很痛苦   和速度很重要。例如,这个:

public enum Shrubbery { GROUND, CRAWLING, HANGING }
     

添加740个字节   你的.dex文件与   相当于三个公共班级   静态最终的整数。在第一次使用时,   类初始值设定项调用   表示每个对象的对象的方法   枚举值。每个对象   得到自己的静态字段,然后   全集存储在一个数组中(a   静态字段称为“$ VALUES”)。那是   很多代码和数据,只有三个   整数。另外,这个:

Shrubbery shrub = Shrubbery.GROUND;
     

导致静态字段查找。如果   “GROUND”是一个静态的最终int,the   编译器会将其视为已知的   恒定并内联它。

来源:Avoid Enums Where You Only Need Ints

答案 1 :(得分:14)

整数较小,需要较少的开销,这在移动设备上仍然很重要。

答案 2 :(得分:5)

我的一位同事对这种情况进行了一次小测试。他自动生成了一个 classenum具有相同数量的“枚举”。我相信他创造了30000个参赛作品。

结果是:

  • .class class约为1200KB
  • .class enum约为800KB

希望这有助于某人。