【问题标题】:enum vs android @Intdef - which one is better optimizedenum vs android @Intdef - 哪个更好优化
【发布时间】:2026-01-12 10:15:01
【问题描述】:

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

来自关于内存的 android 文档overhead

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

【问题讨论】:

    标签: android enums android-support-library


    【解决方案1】:

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

    很多 android 文档都过时了,这很可能就是其中之一。早在 android 的早期,每一点都很重要,但现在设备的功能要强大得多。就我个人而言,我会根据设计要求在这两个选项之间进行选择,而不是过于关注效率。此外,其中一些更高级注释的语法并不能使代码简洁易读,因此不喜欢那里。但是,如果情况需要良好的旧静态整数,@Intdef 会以视觉混乱为代价为您购买一些保护。

    【讨论】:

    【解决方案2】:

    除了以前的答案,我还要补充一点,如果您使用 Proguard(并且您绝对应该这样做以减小大小并混淆您的代码),那么您的 Enums 将自动转换为 @IntDef 无论它在哪里可能:

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

    类/拆箱/枚举

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

    因此,如果您有一些离散值并且某些方法应该只允许采用这些值而不是其他相同类型的值,那么我会使用Enum,因为 Proguard 会为我手动优化代码。

    还有here is Jake Wharton 的一篇关于使用枚举的好帖子,看看吧。

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

    【讨论】:

    • 当然,“尽可能”并没有那么大的意义。
    • 如果我没记错的话,它会转换所有的“简单”枚举。如果枚举中有字段或方法,则不会被转换。我找不到这个描述的链接,但听起来很合理。
    • 我检查了,如果 R8 对 enum 执行相同的操作,并且看起来它会将这些保留为枚举。你试过了吗?