一、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"的静态数组变量中。而这么一大堆代码,仅仅是为了使用三个整数。

Android中是否推荐使用枚举Enum的更多相关文章

  1. Android中Enum(枚举)的使用

    简介 enum 的全称为 enumeration, 是 JDK 1.5  中引入的新特性,存放在 java.lang 包中. 创建枚举类型要使用 enum 关键字,隐含了所创建的类型都是 java.l ...

  2. [改善Java代码]推荐使用枚举定义常量

    枚举和注解都是在Java1.5中引入的,虽然他们是后起之秀,但是功能不容小觑,枚举改变了常量的声明方式,注解耦合了数据和代码. 建议83:推荐使用枚举定义常量 一.分析 常量的声明是每一个项目中不可或 ...

  3. 拔高你的Java代码质量吧:推荐使用枚举定义常量(转)

    提高你的Java代码质量吧:推荐使用枚举定义常量 一.分析 常量的声明是每一个项目中不可或缺的,在Java1.5之前,我们只有两种方式的声明:类常量和接口常量.不过,在1.5版之后有了改进,即新增了一 ...

  4. [置顶] Android学习系列-Android中解析xml(7)

    Android学习系列-Android中解析xml(7) 一,概述 1,一个是DOM,它是生成一个树,有了树以后你搜索.查找都可以做. 2,另一种是基于流的,就是解析器从头到尾解析一遍xml文件.   ...

  5. Android 中如何使用 enum / 枚举

    如何在Android开发中合理的使用enum 欢迎大家访问我的Github开源库,这里有好玩的App源码,想和大家分享.https://github.com/ChoicesWang 转载请注明:htt ...

  6. 关于Java中枚举Enum的深入剖析

    在编程语言中我们,都会接触到枚举类型,通常我们进行有穷的列举来实现一些限定.Java也不例外.Java中的枚举类型为Enum,本文将对枚举进行一些比较深入的剖析. 什么是Enum Enum是自Java ...

  7. Android 开发中是否应该使用枚举?

    本文由咕咚发布在个人博客,转载请注明出处. 本文永久地址:https://gudong.name/2019/11/04/use-enum-or-not.html 在 Android 官方文档推出性能优 ...

  8. 【转】Android中的内存管理--不错不错,避免使用枚举类型

    原文网址:http://android-performance.com/android/2014/02/17/android-manage-memory.html 本文内容翻译自:http://dev ...

  9. 在Android中使用枚举注解而不是枚举

    Enums often require more than twice as much memory as static constants. You should strictly avoid us ...

随机推荐

  1. 画一条0.5px的线

    通过伪类元素:after为其添加样式,用transform:scaleY令其在垂直方向缩小0.5倍 .div:after{ height: 1px; transform: scaleY(0.5); t ...

  2. windows 和linux 文件互传

    1.sz +  文件   [拷贝到windows上] 2.rz + 文件 [拷贝到linux上]

  3. 『计算机视觉』Mask-RCNN_训练网络其二:train网络结构&损失函数

    Github地址:Mask_RCNN 『计算机视觉』Mask-RCNN_论文学习 『计算机视觉』Mask-RCNN_项目文档翻译 『计算机视觉』Mask-RCNN_推断网络其一:总览 『计算机视觉』M ...

  4. 『OpenCV3』基于色彩分割图片

    一.遍历图像实现色彩掩码 本节我们实现这样一个算法,我们指定某种颜色和一个阈值,根据输入图片生成一张掩码,标记符合的像素(和指定颜色的差异在阈值容忍内). 源代码如下,我们使用一个class完成这个目 ...

  5. safari图片跨域

    http://blog.csdn.net/renfufei/article/details/51675148

  6. .Net Core2.1 部署到IIS

    1. 发布网站,和.net framework MVC一样 2.安装WindowsHosting和.Net Core SDK 下载地址:https://www.microsoft.com/net/do ...

  7. Faster-RCNN 自己的数据训练

    参考网址:https://blog.csdn.net/l297969586/article/category/7178545(一呆飞仙)Faster-RCNN_TF代码解读,参考网址:https:// ...

  8. .net core 使用log4net日志组件

    一个web站点必须要记录日志,否则哪里出错了,完全是黑娃找黑妹,两眼一抹黑. 最常用的就是log4net日志组件.我们可以通过扩展加入日志组件. 第一步:在项目中NuGet log4net包,即 In ...

  9. base64详解及实现

    概述 base64 说起来大家应该都是很熟悉的,很多类型的数据都可以转成base64的编码规则,例如图片,pdf,文本,邮件内容等. 什么是base64 根据RFC2045的定义,base64被定义为 ...

  10. SQL注入之Sqli-labs系列第三十四关(基于宽字符逃逸POST注入)和三十五关

    开始挑战第三十四关和第三十五关(Bypass add addslashes) 0x1查看源码 本关是post型的注入漏洞,同样的也是将post过来的内容进行了 ' \ 的处理. if(isset($_ ...