“避免只需要整数的枚举”部分已从官方 开发人员文档中删除。(旧章节内容见 为什么 Android 不使用更多的枚举?)
为什么? Android 虚拟机有什么变化让这个提示过时了吗?
猜猜看:
因此,对于 GUI 应用程序相对普通的需求,枚举的开发时益处远远大于额外的运行时成本。
那份文件的原始版本只是一堆偏见。它被重写为只包含由实际基准测试支持的事实,并且随着 VM 的更新而更新。您可以在 http://code.google.com/p/dalvik/中找到各种基准测试——以及我们用于优化核心库的一些基准测试。
Elliott Hughes 在他的博客 http://elliotth.blogspot.com/2010/09/java-benchmarks.html上提供了更多关于文档重写的细节
文章的后半部分解释了 Performance 文档上的每个声明现在都有基准的支持。以前版本的文档显然包含未经证实的声明,比如,“避免枚举,因为它们太昂贵了。”
Elliot Hugues 在2011年的回答中表示,避免枚举的最初原因是出于性能方面的考虑... ... 比如“处理性能”。由于这个理由没有事实依据,所以从官方文件中删除了。
它是后来添加的,因为枚举在内存中添加的数据比使用整数添加的数据多得多。
这仍然不利于内存性能。
Https://developer.android.com/training/articles/memory.html#overhead
编辑: 现在它被删除了。可以安全地使用枚举。
TLDR: Dalvik 在内存分配方面表现不佳,Enum比 int使用更多的内存。Android Lollipop 取代了达尔维克,使用抗逆转录病毒疗法,这种疗法不会受到同样的限制。因此,这个建议不再相关。
Enum
int
长话短说:
哇! 8年,5个答案和许多评论后,真正的原因仍然没有得到解决。
在前棒棒糖 Android 时代,Dalvik 是虚拟机使用的进程。由于在此期间只有少量内存可供应用程序使用,Dalvik 有很多内存限制。对于内存分配,Dalvik 必须遍历堆并找到空间。随着时间的推移,堆也会变得支离破碎。达尔维克无法碎片整理,所以它会随着时间的推移分配,最终耗尽空间。
避免只需要整数的枚举
来自 Dalvik 时代,因为 Enum比 int大得多,而且内存分配非常昂贵。
快进到今天,达尔维克已经被 ART 所取代。 ART 是在 KitKat 出现的,自从棒棒糖以来就是默认的。
ART 是从头开始创建的,不是为了优化内存,而是为了优化性能。它还针对分配和集合进行了优化。原因是它有专门用于大型对象的内存。不是把所有东西放在同一个堆里, 然后必须在所有的小对象中为大对象找到空间,ART 将所有的大对象和位图放在一个单独的堆中。然后这些小对象被放入单独的堆中。也可以整理碎片。
在 ART 之后,如果你使用 Enum,Android 并不关心,这就是为什么现在推荐消失了。
这是来自谷歌的 Chet Haase。我建议找到他的谷歌 I/O 谈话和观看整个视频。它包含了很多关于 Android 的有用信息和见解。