关闭

android 为什么谷歌官方不建议在项目中使用 Enum

标签: android谷歌enum面试题
473人阅读 评论(0) 收藏 举报
分类:

今天看到一个面试题 就是关于这个的 本来第一反应就是 占内存呀 ,,但是为什么占内存还是 自己也说不出个所以然来 还是太菜了呀 所以在这里详细记录一下 为什么占内存

在日常开发中 我们都使用过 判断语句 没错判断语句但我们一般都会使用常量或者枚举(enum) 就像下面这样

  • 示例代码 使用常量

public class Main {
     private static final DEFAULE_FLAG = 0;
     private static final MAX_FLAG = 2;
     public static void main(String[] args) {
        judge(2);
     }
     private static void judge(int flag) {
        if (flag == DEFAULE_FLAG ) {
            System.out.println("DEFAULE_FLAG ---- >")
        }else if(flag == MAX_FLAG) {
            System.out.println("MAX_FLAG ---- >")
        }
     }

}
  • 使用枚举
public class Main {

     public static void main(String[] args) {
        judge(FlagValue.MAX_FLAG);
     }
     private static void judge(FlagValue flag) {
            if (flag == FlagValue.DEFAULE_FLAG) {
                System.out.println("DEFAULE_FLAG ---- >");
            }else if(flag == FlagValue.MAX_FLAG) {
                System.out.println("MAX_FLAG ---- >");
            }
     }

}
enum FlagValue{
    DEFAULE_FLAG,
    MAX_FLAG
}

在effect java中说过 用枚举(enum)来代替常量是一个非常安全的方法 但是对于这么一个安全的方法 谷歌官方为什么不建议使用呢,下面我们使用 javac来反编译 使用枚举的代码

  • 首先使用 javac 将代码反编译为class文件 然后再用 javap来将class文件反编译得到一个FlagValue的class文件
    这里写图片描述
  • 然后再次使用 javap 反编译 FlagValues.class 就可以看到 如下代码
    这里写图片描述

我们可以看到 枚举实际上用的这些代码 下面我们可以看到这些代码

final class FlagValue extends java.lang.Enum<FlagValue> {
  public static final FlagValue DEFAULE_FLAG;
  public static final FlagValue MAX_FLAG;
  public static FlagValue[] values();
  public static FlagValue valueOf(java.lang.String);
  static {};
}

我们知道使用enum耗费内存 现在我们通过这个代码来算一下 光是一个 数组对象的对象头就占用24个字节 一个对象的引用就是八个字节 我们都知道一个 int 值只有四个字节,,,所以相比较的话 使用enum(枚举)肯定会更加浪费内存的所以大家在android开发中都尽量不要使用enum来进行开发

2
0
查看评论

Android 性能:避免在Android上使用ENUM

Android 性能:避免在Android上使用ENUM# ENUM是什么,为什么使用它 `Enum`是Java中包含固定常量的数据类型。当需要使用预先定制的几个值,这几个值表示一些数据类,这时我们可以用`ENUM`。在一些可能的值中取一个值时很适合用`Enums`。例如:
  • ysmintor
  • ysmintor
  • 2017-04-08 23:24
  • 1534

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

最近优化App,由于项目中使用了Lib,而Lib代码中包含了大量的枚举类型,导致App占用内存过多。好吧,知道问题点,那就干掉,抛弃之~ 问题是解决了,为啥会这样呢? 先来看看Android官网的说明吧: 看见了吧,Android官网不建议咱们使用enums,说的也很清楚了,占用内存多(E...
  • lingruimingfeng
  • lingruimingfeng
  • 2016-05-30 16:22
  • 3473

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

The price of ENUMs 在StackOverFlow等问答社区常常出现关于在Android系统里面使用枚举类型的性能讨论,关于这一点,Android官方的Training课程里面有下面这样一句话: Enums often require more than twice as...
  • hxqneuq2012
  • hxqneuq2012
  • 2017-01-05 17:59
  • 357

关于svn在项目开发中的使用建议

最近公司在开发项目中出现新版本待上线,同时又有下一版本的新功能开发的情况,导致测试与新功能开发中出现了很多冲突,公司的svn代码管理仅仅是存放代码,并没有对项目代码做分支处理。我在网上搜索了些相关内容,并作如下链接: 1.解决版本冲突-使用svn主干与分支功能(重点介绍) http://ww...
  • gxt371612453
  • gxt371612453
  • 2016-09-14 10:22
  • 306

Solr-项目中的使用

配置中文分析器 在SolrCore的conf下的schema.xml是Solr数据表配置文件,定义了加入索引的数据的数据类型。 主要包括Fields,FieldTypes和其他的一些设置。 ...
  • LLLLLiSHI
  • LLLLLiSHI
  • 2017-05-07 14:01
  • 614

为什么我的项目中要使用Redis

转自:http://www.cnblogs.com/runningsmallguo/p/5871412.html 我知道有些地方没说到位,希望大神们提出来,我会吸取教训,大家共同进步! 注册时邮件激活的部分使用Redis发送邮件时使用Redis的消息队列,减轻网站压力。使用Lucen...
  • sinat_30474567
  • sinat_30474567
  • 2017-06-08 14:56
  • 3406

android 为什么不建议使用Enum

http://blog.csdn.net/qq_33048603/article/details/68947422
  • Nobita_dgut
  • Nobita_dgut
  • 2017-04-17 17:38
  • 183

ActiveMQ的在实际项目中的简单使用

简介 本文达到的目的是会用。 安装服务器: 官网下载win版的,也可是linux版的; 启动服务器:win版的执行activemq.bat 看看是否安装成功:http://localhost:8161/   activeMQ是一个消息服务器, 2中模式:点对点、广播...
  • ljl18566743868
  • ljl18566743868
  • 2016-11-08 15:54
  • 1093

项目中为什么使用SSH

1. 使用Struts:因为struts是基于MVC模式的,很好的将应用程序进行了分层,使开发者更关注于业务逻辑的实现;第二,struts有着丰富的taglib,如能灵活运用,则能大大提高开发效率。 2. 使用Hibernate:因为hibernate为Java应用提供了一个易用的、高效率的对象关...
  • u011247211
  • u011247211
  • 2013-09-30 15:40
  • 1569

线程在实际项目中简单的应用

前段时间开发的项目中有一个office在线预览的功能,我们知道需要实现这个功能一般是 后台把用户上传的txt啊excel啊word啊先转换成pdf格式,然后使用pdf.js进行前台预览(有的还 需要转换成swf文件),功能倒是实现了,只是客户反馈提交表单的时候速度比较慢,我试了一下 ,确实比较慢,大...
  • u014417573
  • u014417573
  • 2017-11-30 13:50
  • 243
    个人资料
    • 访问:112183次
    • 积分:1387
    • 等级:
    • 排名:千里之外
    • 原创:41篇
    • 转载:3篇
    • 译文:0篇
    • 评论:32条
    博客专栏
    最新评论