Android性能优化—不建议使用枚举Enum

原创 2016年05月30日 16:22:55

最近优化App,由于项目中使用了Lib,而Lib代码中包含了大量的枚举类型,导致App占用内存过多发火。好吧,知道问题点,那就干掉,抛弃之~偷笑

问题是解决了,为啥会这样呢?疑问 先来看看Android官网的说明吧:

看见了吧,Android官网不建议咱们使用enums,说的也很清楚了,占用内存多(Enums often require more than twice as much memory as static constants.)。

Android中当你的App启动后系统会给App单独分配一块内存。App的DEX code、Heap以及运行时的内存分配都会在这块内存中。

生气举个栗子:

1.使用Int表示状态

public static final int VALUE1 =1;
public static final int VALUE1 =2;
public static final int VALUE1 =3;

2.使用Enums表示状态

public static enum Value{
  VALUE1,
  VALUE2,
  VALUE3
}

情形2中的DEX size增加是情形1中的13倍之多。这还只是DEX code的增加,同样,运行时的内存分配,一个enum值的声明会消耗至少20 bytes,这还不算其中的对象数组需要保持对enum值的引用。Why?使用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则会引起对静态变量的引用。

因 此,当你的代码或包含的Lib中大量使用enums时,对于本身内存小的手机将是灾难性的。不可否认enums会使得代码更易读更安全,但是我们使用 Int也可以通过@IntDef 注解防止编译时Lint errors。当然如果你使用enums,proguard在一些情况下会优化你的代码使用Int代替。


Android之使用枚举利弊及替代方案

Android之使用枚举利弊及替代方案文章链接知识点: 不使用枚举enum引起的类型不安全问题; 使用枚举enum的利弊; 利用@interface+@IntDef/@StringDef替代enum;...
  • qq_16628781
  • qq_16628781
  • 2017年04月03日 00:31
  • 1904

Android代码替代枚举的正确之道

众所周知,在Android官方的性能优化相关课程中曾经提到使用枚举存在的性能问题,不建议在Android代码中使用枚举: Enums often require more than twic...
  • heng615975867
  • heng615975867
  • 2016年06月23日 11:51
  • 1519

enum类型被intent所携带时各种情况的示例代码

  • 2012年12月22日 18:36
  • 828KB
  • 下载

Enum使用心得

最近在学习spring MVC,还有jquery-easyui等框架,于是顺便自己搭了个框架玩玩,因为本人比较懒,又爱瞎折腾,于是就有了下面这些思考。 现在很多人在设计数据库的时候会将诸如“男女”,...
  • u010571913
  • u010571913
  • 2015年03月21日 09:58
  • 958

Android是否推荐使用枚举(enum)?使用枚举的利弊以及枚举倒底占多少内存?

一、安卓中是否推荐使用枚举enum 产生: enum的全称为 enumeration,是 JDK1.5 中引入的新特性,存放在 java.lang 包中,包括Enum,EnumSet,EnumM...
  • xmc281141947
  • xmc281141947
  • 2017年02月22日 15:52
  • 877

java 枚举——java(android)中枚举的运用和使用场景

如果作为一个java开发工程师还不了解或者还不能很好的运用枚举这个新特性的话,那你就得好好看一看枚举了。因为枚举在java5以后是个很好用的新特性。...
  • yehui928186846
  • yehui928186846
  • 2016年05月16日 16:57
  • 3845

android开发之避免使用枚举

Java1.5中引入了枚举的语法,包括Enum,EnumSet,EnumMap等。其中Enum就是我们在C或C++中见过的枚举类型,但是Java中的枚举又比C或C++中的枚举更成熟和复杂。在Java中...
  • zjd934784273
  • zjd934784273
  • 2017年01月22日 17:46
  • 531

【Android性能优化】避免使用Enum

The price of ENUMs 在StackOverFlow等问答社区常常出现关于在Android系统里面使用枚举类型的性能讨论,关于这一点,Android官方的Training课程里面有...
  • hxqneuq2012
  • hxqneuq2012
  • 2017年01月05日 17:59
  • 357

Android:自定义控件 --- 自定义属性 枚举值(固定属性值)

今天写一个自定义控件,为了提高使用者使用效率,需要对一个属性的所有可能属性值进行枚举(即,只能选择使用给出的属性值) 查了很多资料,自己总结一下。 如何写自定义控件就不在赘述了,网上很多大神写的都...
  • u010635353
  • u010635353
  • 2015年10月21日 16:13
  • 7362

快速枚举

快速枚举     快速枚举的特性使得我们可以使用简洁的语法来安全、有效地枚举集合中的内容。 for...in     快速枚举的特性使得我们可以对集合中的元素进行枚举。其用法如下:    ...
  • amdbenq
  • amdbenq
  • 2012年08月14日 08:34
  • 3937
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android性能优化—不建议使用枚举Enum
举报原因:
原因补充:

(最多只允许输入30个字)