Enum Vs @IntDef

Enum 和 @intDef 到底哪个好?

现在大多数博文的倾向都取决于多年前的一篇Android官方开发文档(已过时)

Enums often require more than twice as much memory as static constants. You should strictly avoid using enums on Android.
枚举通常需要的内存是静态常量的两倍多。你应该严格避免在Android上使用枚举。

然而事实上这篇文档已经过时多年,这个条例也早已被删除,在早年的移动系统中,任何一点内存都无比的宝贵,才需要如此的精打细算。而早在Android2.2 时代的JIT就已经对Enum进行了优化,使它的运行效率与常量并无区别,而今的手机内存动不动8G,12G,比电脑的内存还要大,是否依然有必要遵循这个条例?

Android VM开发组成员Elliott Hughes又在他的博客中提过这个问题(现已被删除):

Previous versions of the doc apparently contained unverified claims, like, “Avoid enums because they are too expensive.”
之前文档的观点明显具有未经证实的声明,例如“因代价太昂贵应避免使用枚举”

但他之前在Stack overflow的回复现在还能找到:

the original version of that document was just a bunch of prejudices. it’s been rewritten to only contain facts backed up by actual benchmarks, and it’s updated as the VM is updated. you can find the various benchmarks – plus some of the benchmarks we use to optimize the core libraries – at http://code.google.com/p/dalvik/.

至此,如果仅仅是出于性能和内存上的考虑, 在static final int与Enum的权衡上似乎Enum已经拥有很大的优势了,进一步分析之前我们再来复习一下Enum所具有的的优点:

  • 相比integers, strings,boolean 型标记具有类型安全
  • 代码更易读 写代码时IDE可以帮助我们更容易找出合法的值
  • 相比int或String枚举通常不会被设为无效的值
  • 代码更易读
  • 可以使用多态和方法扩展

而在我们确定选择Enum之前我们需要注意到几点:

  1. 虽然在运行效率和内存占用上已经为Enum平反,但它作为一个类需要占用更多的内存空间和存储空间是毋庸置疑的事情,即便在现代平台的条件下内存条件可以忽略不计,它仍然会增大几k到几十k的apk大小(这需要依自己的情况来看是否重要)
  2. 使用整型常量作为Flag可以进行 | , & 等操作,这是Enum不具备的优势
  3. 谷歌推出了@IntDef 和 @StringDef注解来帮助我们使用int常量,这使得对是否使用Enum的考量瞬间变得胶着了起来,它几乎完全扯平了我们上述所列Enum优点的前三条

我们从以下两个角度来考虑

  1. 如果你不使用Enum的多态及方法,仅仅使用Enum的int的属性,在最终编译的时候会被编译为static final int,所以它在性能或空间占用上与@IntDef并无二致,那么:
  • 如果你需要使用多态,那么Enum是你的最优选择
  • 如果你需要对其进行 | , & 等操作,那么使用@intDef注解的整型常量同样是你的最优选择
  1. 如果上面两个功能你都不需要,出于使用过多注解会使代码可读性变差的考虑,使用Enum会使你的代码具有更好的可读性。当然整篇文章其实是出于锱铢必较的考究,所以遵从自己的使用习惯就OK的。

重要的事情在于,Enum并不会降低我们软件的效率,在当我们有需要时,它仍然是我们的首选之一,当然了,当你创造出几千甚至上完Enum的时候,你就需要考虑重新设计你的软件了。

引用

  1. https://developer.android.com/training/articles/perf-tips#avoid_enums
  2. https://stackoverflow.com/questions/5143256/why-was-avoid-enums-where-you-only-need-ints-removed-from-androids-performanc
  3. https://stackoverflow.com/questions/4822877/why-doesnt-android-use-more-enums

猜你喜欢

转载自blog.csdn.net/qq_32916805/article/details/87923591