当筵意气临九霄,星离雨散不终朝。这篇文章主要讲述Android中是否推荐使用枚举Enum相关的知识,希望能为你提供帮助。
一、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以及运行时的内存分配都会在这块内存中。
比如:
1.使用Int表示状态 public static final int VALUE1 =1; public static final int VALUE2 =2; public static final int VALUE3 =3;
2.使用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 到底占多少内存?该如何用?
请参照 http://www.liaohuqiu.net/cn/posts/android-enum-memory-usage/
四、替代方案
个人倾向与接口变量,因为接口会自动将成员变量设置为静态的(static)、不可变的(final),这一点可以防止某些情况下错误地添加新的常量。这也使得代码看起来更简单和清晰。 同时,一个的简单测试显示,同样的接口(字节码文件)占用的空间是209个字节左右,而类(字节码文件)占用的空间是366个字节左右。更少的字节码文件意味着加载和维护的成本更低。此外,JVM 加载接口的时候,不需要担心类提供的额外特征(如重载、方法的动态绑定等),因此加载更快。
【Android中是否推荐使用枚举Enum】五、总结
不可否认enums会使得代码更易读更安全,但是在编写高效Android代码时避免使用枚举,我们在很多经典的Java书已经看到推荐使用枚举来代替int常量了,但是在Android开发中我不建议使用枚举,特别是大型的App中,能不用则不用。因为它会牺牲执行的速度和并大幅增加文件体积。这也是性能优化中减少OOM的一个方面。
例如: public class Foo { public enum Shrubbery { GROUND, CRAWLING, HANGING } } 会产生一个900字节的.class文件(Foo$Shubbery.class)。在它被首次调用时,这个类会调用初始化方法来准备每个枚举变量。每个枚举项都会被声明成一个静态变量,并被赋值。然后将这些静态变量放在一个名为"$VALUES"的静态数组变量中。而这么一大堆代码,仅仅是为了使用三个整数。
推荐阅读
- android 多行 RadioButton的使用
- 如何利用Thread制作简单的android动画
- android问题笔记集
- Android权限 uses-permission
- android中shape 的使用
- 修改 Android 5.x 系统默认音量大小
- Win 8系统Modules Installer Worker与Problem Reporting进程占用大量磁盘怎样办
- Win 8系统连接应用商店提示“网络连接超时”怎样办
- win8.1系统玩大富翁4出现闪退怎样办|win8.1系统玩大富翁4出现闪退的处理办法