09-1-2015
Java提供了枚举(enum)类型来方便我们定义一些常量,这很方便组织我们的代码。但是殊不知枚举比静态常量占用了两倍多的内存。所在在我们Android开发中,不要再使用枚举而是使用静态常量或注解@IntDef来取代。当然在代码中使用了枚举也可以不修改代码,但是需要在发布app时使用ProGuard会将枚举转换为静态常量。
enusm是如何影响到我们的app的
我们知道代码最终会编译成DEX文件,并且在运行时加载到内存中。系统为我们的app分配了一定的内存。这个内存大小可以在adb中执行adb shell getprop | grep heap
来查看。DEX文件会占用系统为我们分配的内存。如果DEX文件过大的话,可用内存就会变小。
例如我们现在有一个app它的DEX文件编译后为2566bytes
。我们添加一些静态常量代码:
最终编译生成的DEX大小为2680bytes
。
相比我们来看下enum:
最终生成的DEX大小达到4188bytes
,我们看到加了一个enum就让DEX占用了如此大的内存。如果你在app中很多地方用到了enum,真是太可怕了。
定义一个enum,enum中的每一项都会额外占用20+bytes
,另外系统会为enum数组额外分配12-16bytes
。