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

jny*_*len 79 enums android

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

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

但是,Android框架有许多情况需要传递各种类型的标志,但它们似乎都没有使用枚举.在那里我会认为他们的使用将是有益的一对夫妇的例子是Toast.LENGTH_SHORT/ Toast.LENGTH_LONGView.GONE,View.VISIBLE等等.

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

Seb*_*olm 66

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

枚举可用于Froyo及以上 - 根据这个答案(为什么"从Android的性能提示中删除了"只能从你需要的地方获取的枚举?)来自Android VM团队成员(以及他的博客).


上一个答案:

Android团队的官方建议是在可以避免的情况下避免枚举:

枚举非常方便,但不幸的是,当尺寸和速度很重要时会很痛苦.例如,这个:

public enum Shrubbery { GROUND, CRAWLING, HANGING }
Run Code Online (Sandbox Code Playgroud)

与具有三个公共静态最终整数的等效类相比,您的.dex文件增加了740个字节.首次使用时,类初始值设定项会在表示每个枚举值的对象上调用该方法.每个对象都有自己的静态字段,完整集存储在一个数组中(一个名为"$ VALUES"的静态字段).这是很多代码和数据,只有三个整数.另外,这个:

Shrubbery shrub = Shrubbery.GROUND;
Run Code Online (Sandbox Code Playgroud)

导致静态字段查找.如果"GROUND"是静态final int,编译器会将其视为已知常量并将其内联.

来源:避免在只需要Ints的地方使用Enums

  • 这可能不再有效,请参阅http://stackoverflow.com/questions/5143256/why-was-avoid-enums-where-you-only-need-ints-removed-from-androids-performance (25认同)
  • 因此,虽然C#enums*do*表现得非常好,但Java枚举不会因为它们更复杂.因此,我的最后一点不是真的.正确? (4认同)
  • Android文档仍然建议不要使用枚举:**"枚举通常需要的内存是静态常量的两倍以上.你应该严格避免在Android上使用枚举."**http://developer.android.com/training/文章/ memory.html#架空 (2认同)

Rus*_*een 14

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


pro*_*007 5

我的一位同事对这种情况进行了一次小测试.他自动生成一个 class和一个enum具有相同数量的"枚举".我相信他生成了30000个条目.

结果是:

  • .class对于class大约1200KB
  • .class对于enum大约800KB

希望这有助于某人.

  • @Iwo Banas任何测试都是有效的测试.没说它会回答这个问题.只是为任何可能感兴趣的人提供额外信息.投票似乎非常值得,谢谢.-_- (7认同)