一、Enum的产生

Java1.5中引入了枚举的语法,包括Enum,EnumSet,EnumMap等。其中Enum就是我们在C或C++中见过的枚举类型,但是Java中的枚举又比C或C++中的枚举更成熟和复杂。在Java中,枚举算是一种特殊的类,也就是class,因此它可以做很多类相关的事情,而不仅仅是定义几个枚举值

二、Android官方建议

Android官网不建议使用enums,占用内存多(Enums often require more than twice as much memory as static constants.)。
Android中当你的App启动后系统会给App单独分配一块内存。App的DEX code、Heap以及运行时的内存分配都会在这块内存中。
比如:
.使用Int表示状态
public static final int VALUE1 =;
public static final int VALUE2 =;
public static final int VALUE3 =;
.使用Enums表示状态
public static enum Value{
VALUE1,
VALUE2,
VALUE3
}

2中使用Enums,DEX size增加是情形1中的13倍之多。这只是DEX code的增加,同样,运行时的内存分配,一个enum值的声明会消耗至少20 bytes,不算其中的对象数组需要保持对enum值的引用。使用javap反编译情形二中生成的class文件,去掉汇编代码后如下:

public final class VALUE extends java.lang.Enum{
public static final VALUE VALUE1;
public static final VALUE VALUE2;
public static final VALUE VALUE3;
private static final VALUE[] values[];
static{}
}

enum类型继承java.lang.Enum,每个枚举项都会被声明成一个静态变量,并被赋值。VALUE value1 = VALUE.VALUE1则会引起对静态变量的引用。

三、Android 中的 Enum 到底占多少内存?该如何用?

四、替代方案

个人倾向与接口变量,因为接口会自动将成员变量设置为静态的(static)、不可变的(final),这一点可以防止某些情况下错误地添加新的常量。这也使得代码看起来更简单和清晰。
同时,一个的简单测试显示,同样的接口(字节码文件)占用的空间是209个字节左右,而类(字节码文件)占用的空间是366个字节左右。更少的字节码文件意味着加载和维护的成本更低。此外,JVM 加载接口的时候,不需要担心类提供的额外特征(如重载、方法的动态绑定等),因此加载更快。

五、总结

不可否认enums会使得代码更易读更安全,但是在编写高效Android代码时避免使用枚举,我们在很多经典的Java书已经看到推荐使用枚举来代替int常量了,但是在Android开发中我不建议使用枚举,特别是大型的App中,能不用则不用。因为它会牺牲执行的速度和并大幅增加文件体积。这也是性能优化中减少OOM的一个方面。
例如:
public class Foo {
public enum Shrubbery { GROUND, CRAWLING, HANGING }
}
会产生一个900字节的.class文件(Foo$Shubbery.class)。在它被首次调用时,这个类会调用初始化方法来准备每个枚举变量。每个枚举项都会被声明成一个静态变量,并被赋值。然后将这些静态变量放在一个名为"$VALUES"的静态数组变量中。而这么一大堆代码,仅仅是为了使用三个整数。

最新文章

  1. spring mybatis 事务配置及使用
  2. 23.mysql集群(master-master)
  3. struts入门实例
  4. Vi编辑器下使用分屏显示【已自己验证所有】
  5. Unity3D之Mecanim动画系统学习笔记(七):IK(反向动力学)动画
  6. C# - string 转为 DateTime(自定义)
  7. gdb小结
  8. 现有C2B模式小总结
  9. hdu 1208 Pascal's Travels
  10. JavaScript面向对象基础语法总结
  11. React入门---组件-4
  12. .NET Core 配置Configuration杂谈
  13. hdu3340 线段树+多边形
  14. 关于ML.NET v0.5的发布说明
  15. java 中使用正则表达式操作字符串
  16. python Event对象、队列和多进程基础
  17. Python列表的一点用法
  18. web roadmap
  19. 死磕 java集合之ArrayDeque源码分析
  20. Javascript中变量提升的问题(五)

热门文章

  1. ios10兼容问题
  2. idea中springboot项目程序入口右键不显示run as的原因
  3. 关于NOIP复赛规模的规定
  4. iPhone手机更换自定义铃声
  5. js的预解析详解
  6. angular2升级到angular4历程
  7. L330 Black hole picture captured for first time in space ‘breakthrough’
  8. nodejs -- require , exports , module
  9. 2--Postman脚本介绍
  10. easyui,文件引用