【问题标题】:Why doesn't Android use more enums?为什么 Android 不使用更多的枚举?
【发布时间】:2011-06-16 21:51:21
【问题描述】:

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

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

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

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

【问题讨论】:

标签: android enums


【解决方案1】:

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

枚举可用于 Froyo 及更高版本 - 根据 Android VM 团队成员(和 his blog)的此答案 (Why was “Avoid Enums Where You Only Need Ints” removed from Android's performance tips?)。


上一个答案:

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

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

public enum Shrubbery { GROUND, CRAWLING, HANGING }

将 740 字节添加到 您的 .dex 文件与 与三个公共的等效类 静态最终整数。首次使用时, 类初始化器调用 代表每个对象的方法 枚举值。每个对象 获得自己的静态字段,并且 全套存储在一个数组中(一个 名为“$VALUES”的静态字段)。那是 大量代码和数据,仅用于三个 整数。另外,这个:

Shrubbery shrub = Shrubbery.GROUND;

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

来源:Avoid Enums Where You Only Need Ints

【讨论】:

  • 因此,虽然 C# 枚举 do 性能非常好,但 Java 枚举却不行,因为它们更复杂。因此,我的最后一个要点并不是真的。对吗?
  • 这可能不再有效,请参阅stackoverflow.com/questions/5143256/…
  • Android 文档仍然建议不要使用枚举:“枚举通常需要两倍于静态常量的内存。您应该严格避免在 Android 上使用枚举。” @ 987654325@
  • @SebastianPaaskeTørholm 您提供的链接(此:developer.android.com/guide/practices/design/…)不再显示提示。
【解决方案2】:

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

【讨论】:

  • 此外,现在我们有很好的 Android Studio 和 Lint 工具。我的意思是注解IntDefStringDef,它们允许声明某种typedef,所以int常量的使用非常方便。 blog.shamanland.com/2016/02/int-string-enum.html
  • 是的,但是改造模型呢?(以及我认为的其他网络库)您将如何定义状态响应(例如成功、失败、token_expired)以直接映射到 POJO?
【解决方案3】:

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

结果是:

  • .classclass 大约是 1200KB
  • .classenum 大约是 800KB

希望这对某人有所帮助。

【讨论】:

  • 我认为这不是有效的测试。在一个地方拥有 30000 个枚举/静态字段并不是一个现实的场景。您需要比较大量小类/枚举的大小,例如1000 个类/枚举,每个类 30 个属性。我敢打赌,总大小会完全不同。
  • @Iwo Banas 任何测试都是有效的测试。没有说它会回答这个问题。只是将其作为额外信息提供给任何可能感兴趣的人。反对票似乎是当之无愧的,所以谢谢。 -_-
  • 不是相反吗?该枚举使用较少?是 1200KB 还是 800KB 的内存或存储空间?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-25
  • 2013-08-22
  • 1970-01-01
  • 2011-10-22
  • 2019-10-23
  • 1970-01-01
  • 2012-10-28
相关资源
最近更新 更多