enum vs android @Intdef - 哪一个优化得更好

问题描述 投票:0回答:2

我知道,当将常量与枚举进行比较时,常量占用的空间更少并且可以是原始的。我正在研究android中的@Intdef注释,有人可以告诉我使用@Intdef与枚举相比是否有更好的存储空间。现在是否建议在android中将枚举放在一边并在可能的情况下使用@intdef?我怀疑 @Intdef 可以做多态吗?

来自有关内存的 Android 文档 开销

枚举通常需要比静态常量多两倍多的内存。您应该严格避免在 Android 上使用枚举。

android enums android-support-library
2个回答
29
投票

@Intdef 显然更高效,它比仅具有静态最终整数具有零权重,它都是编译时指令。枚举是类,正如您的链接中提到的那样,有一个足迹。 @Intdef 为您提供枚举最基本的功能,即值验证,并且没有枚举的其他功能,例如自动字符串转换。

许多 Android 文档已经过时,这很可能就是其中之一。在 Android 的早期,每一点都很重要,但现在设备的功能更加强大。就我个人而言,我会根据设计的要求在这两个选项之间进行选择,并且不会太追求效率。此外,其中一些更高级注释的语法并不能让代码变得干净、易于阅读,所以不是那里的粉丝。但是,如果情况需要良好的旧静态整数,@Intdef 将为您提供一些保护,但代价是视觉混乱。


18
投票

除了之前的答案之外,我想补充一点,如果您正在使用 Proguard(并且您绝对应该这样做以减少大小并混淆代码),那么您的

Enums
将在可能的情况下自动转换为
@IntDef

https://www.guardsquare.com/manual/configuration/optimizations

类/拆箱/枚举

尽可能将枚举类型简化为整数常量。

因此,如果你有一些离散值,并且某些方法应该只允许采用该值而不是其他相同类型的值,那么我会使用

Enum
,因为 Proguard 将为我完成优化代码的手动工作。

还有这里有 Jake Wharton 写的一篇关于使用枚举的好文章,请看一下。

作为一名库开发人员,我认识到应该进行这些小的优化,因为我们希望对使用应用程序的大小、内存和性能的影响尽可能小。但重要的是要认识到,抛弃迭代器分配与索引循环、使用 HashMap 与像 SparseArray 这样的二进制搜索集合、以及在适当的情况下在公共 API 中放入枚举与整数值是完全没问题的。了解做出明智决策的差异是重要的,除了这个愚蠢的统计数据之外,视频几乎说明了这一点。

© www.soinside.com 2019 - 2024. All rights reserved.