【内存优化】避免使用Enum_第1张图片
图片来自:为什么Android中不建议使用Enums

在Android官网上已经明确指出应该在Android避免使用Enum,因为与静态常量相比,它对内存的占用要大很多。

下面有它们的一个比较:

假设我们有这样一份代码,编译之后的dex大小是2556 bytes,在此基础之上,添加一些如下代码,这些代码使用普通static常量相关作为判断值:
【内存优化】避免使用Enum_第2张图片

增加上面那段代码之后,编译成dex的大小是2680 bytes,相比起之前的2556 bytes只增加124 bytes。假如换做使用enum,情况如下:
【内存优化】避免使用Enum_第3张图片

使用enum之后的dex大小是4188 bytes,相比起2556增加了1632 bytes,增长量是使用static int的13倍。

参照:The price of ENUMs

具体原因是为什么呢?下面我们来对其进行分析分析。

下面定义了4个静态常量:

public static final int RED =0;public static final int GREEN =1;public static final int BLACK =2;public static final int YELLOW =3;

如果使用Enum表示如下:

public static enum Color {    RED, GREEN, BLACK, YELLOW}

我们对Color类进行反编译,进入项目的bin目录,执行 javap -c Color.class

最终结果如下:
【内存优化】避免使用Enum_第4张图片
【内存优化】避免使用Enum_第5张图片

我们对上面的反编译代码进行整理如下:

public final class Color extends java.lang.Enum<Color> {    public static final Color RED;    public static final Color GREEN;    public static final Color BLACK;    public static final Color YELLOW;    static {        RED = new Color("RED", 0);        GREEN = new Color("GREEN", 1);        BLACK = new Color("BLACK", 2);        YELLOW = new Color("YELLOW", 3);        VALUES = new Color[]{RED, GREEN, BLACK, YELLOW};    }    public static Color[] values() {        Color tmp = new Color[VALUES.length];        system.arraycopy(VALUES, 0, tmp, 0, VALUES.length);        return tmp;    }    public static Color valueOf(String name) {        return Enum.valueOf(name);    }}

上面的代码是根据上面反编译出来的代码编写的,不是标准的,操作过程基本可以呈现。

可以看到,本来是可以使用几个静态常量代替的Color类做了这么多额外的操作,分配了这么多内存,这也是Enum在Android不被建议使用的原因。

从上面的代码可以看到,它其实对上面的几个静态常量做了封装,然后又重新定义了几个静态封装对象,代价非常的大。

更多相关文章

  1. 【Android】利用Java代码布局,按钮添加点击事件
  2. Android OpenGL ES(六)----进入三维在代码中创建投影矩阵和旋转
  3. SPDY协议的Android实现 OKHTTP代码分析
  4. 15款android设备上的代码编辑器
  5. Android新姿势:截屏代码整理
  6. Android视录视频示例及代码下载
  7. android recovery 系统代码分析 -- 选择进入
  8. 【Android】技术调研:用代码模拟屏幕点击、触摸事件

随机推荐

  1. android酷炫翻页效果+图形分析
  2. Android(安卓)开发之webview页面返回到最
  3. 初识ViewPager【Android】
  4. 自定义录像机 没任何新意
  5. Android——简单对话框
  6. Android汉字转换成拼音
  7. webview高度自适应图文详情
  8. Android(安卓)仿360恶意广告拦截扫描
  9. Android(安卓)Name Rules 命名规则
  10. android 中Window跟WindowManager