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

我开始真正喜欢在代码中使用 C # 和 Java 枚举的原因有以下几个:

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

然而,Android 框架有许多情况下需要传递各种类型的标志,但似乎没有一个使用枚举。一对夫妇的例子,我认为他们的使用将是有益的是 Toast.LENGTH_SHORT/Toast.LENGTH_LONGView.GONEView.VISIBLE等。

为什么会这样?枚举在 Dalvik 的表现是否比简单的整数值差?还有什么我不知道的缺点吗?

34609 次浏览

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

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

Enums 可以在 Froyo 和 up 上使用——根据来自 Android VM 团队(和 他的博客)成员的这个答案(为什么从 Android 的性能提示中删除了“避免只需要 Ints 的枚举”?)。


上次回答:

Android 团队的官方建议是尽可能避免枚举:

枚举非常方便,但是 不幸的是,当大小可以是痛苦的 and speed matter. For example, this:

public enum Shrubbery { GROUND, CRAWLING, HANGING }

添加740字节到 你的.dex 文件相比 三个公众人士的同等级别 静态最终整数。在第一次使用时, 类初始值设定项调用 对象上的方法,这些对象表示 枚举值。每个对象 获取自己的静态字段,而 整个集合存储在一个数组中(a 静态字段称为“ $VALUES”) 很多代码和数据,就三个人 整数。此外,这个:

Shrubbery shrub = Shrubbery.GROUND;

导致静态字段查找 “ GROUND”是一个静态的最终整数,则 编译器会将其视为已知的 常数和内联。

资料来源: 避免只需要整数的枚举

我的一个同事针对这种情况进行了一个小测试 classenum都有相同数量的“枚举”。我相信他生成了30000个条目。

结果是:

  • class.class大约是1200KB
  • enum.class大约是800KB

希望这对谁有帮助。