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

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

  • 它们比整数,string或布尔标志组更安全得多。
  • 他们导致更可读的代码。
  • 将枚举设置为无效值比int或string更困难。
  • 他们可以很容易地发现variables或参数的允许值。
  • 我读过的所有东西都表明它们在C#和大多数JVM中的performance与整数一样好。

然而,Android框架有很多情况需要传递各种types的标志,但没有一个似乎使用枚举。 几个例子,我认为他们的使用将是有利的Toast.LENGTH_SHORT / Toast.LENGTH_LONGView.GONEView.VISIBLE

为什么是这样? 在Dalvik枚举执行比简单的整数值更糟? 有没有其他的缺点我不知道?

这个答案已经过时了2011年3月。

枚举可以在Froyo上使用 – 根据Android VM团队成员(和他的博客 )的回答( 为什么“避免Enum仅仅需要Ints的地方”从Android的性能提示中删除?


以前的答案:

官方的Android团队build议是避免枚举,只要你可以避免:

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

 public enum Shrubbery { GROUND, CRAWLING, HANGING } 

与具有三个公共静态final int的等效类相比,您的.dex文件增加了740个字节。 在第一次使用时,类初始化程序调用表示每个枚举值的对象的方法。 每个对象都有自己的静态字段,全集存储在一个数组(一个名为“$ VALUES”的静态字段)中。 这是很多代码和数据,只是三个整数。 另外,这个:

 Shrubbery shrub = Shrubbery.GROUND; 

导致静态字段查找。 如果“GROUND”是一个静态的final int,编译器会将其视为一个已知的常量并将其内联。

来源: 避免在只需要Ints的地方引入

整数更小,开销更less,这在移动设备上仍然很重要。

我的一个同事对这种情况进行了一个小testing。 他自动生成一个classenum与“枚举”相同的数量。 我相信他生成了30000个条目。

结果是:

  • .classclass大概是1200KB
  • enum为大约800KB

希望这有助于某人。