枚举是一种规范,它规范了参数的形式,这样就可以不用考虑类型的不匹配(编译期检查)并且显式的替代了int型参数可能带来的模糊概念。
Android官方竟然不推荐使用enum类型,这是怎么回事呢?
请看官方文档:
Android Developer-Avoid enumerations
Avoid enumerations
A single enum can add about 1.0 to 1.4 KB of size to your app's classes.dex
file. These additions can quickly accumulate for complex systems or shared libraries. If possible, consider using the @IntDef
annotation and ProGuardto strip enumerations out and convert them to integers. This type conversion preserves all of the type safety benefits of enums.
每个枚举常量可以使你的应用程序的classes.dex
文件增加大约1.0到1.4 KB的大小。 这些额外增加的占用会迅速在你的系统或共享库中累加。如果可能的话Android中推荐使用@IntDef 注解
或ProGuard
代替。
在Android性能典范(三)
中,对此进行了详细的解释:
假设我们有这样一份代码,编译之后的dex大小是2556 bytes,在此基础之上,添加一些如下代码,这些代码使用普通static常量相关作为判断值:
增加上面那段代码之后,编译成dex的大小是2680 bytes,相比起之前的2556 bytes只增加124 bytes。假如换做使用enum,情况如下:
使用enum之后的dex大小是4188 bytes,相比起2556增加了1632 bytes,增长量是使用static int的13倍。不仅仅如此,使用enum,运行时还会产生额外的内存占用,如下图所示:
可见,enum在Android应用中的使用,不仅会使apk大小增大,另外还会影响内存占用,所以,Android官方强烈建议不要在Android程序里面使用到enum。
Android中推荐使用@IntDef代替枚举类型,明天我们再来了解一下@IntDef注解:)