Android代码替代枚举的正确之道
众所周知,在Android官方的性能优化相关课程中曾经提到使用枚举存在的性能问题,不建议在Android代码中使用枚举:
Enums often require more than twice as much memory as static constants. You should strictly avoid using enums on Android
Effective Java中列举了使用枚举的众多优点,相对于Int
静态常量来说,枚举最大的作用是提供了类型安全。看看如下的栗子:
class Person {public static final int MALE = 0;public static final int FEMALE = 1;private int sex;public void setSex(int sex) {this.sex = sex;}public String getSexDes() {if(sex == 0) {return "男";}else if(sex == 1){return "女";}else {throw new IllegalArgumentException("什么鬼性别?");}}
}
因为调用者可以在setSex()
传递任何整数,那么导致出现了非男非女的性别,而使用枚举可以有效避免上述情况。
为了弥补Android平台不建议使用枚举的缺陷,官方推出了两个注解,IntDef
和StringDef
,用来提供编译期的类型检查,使用灰常简单,下面以IntDef
为栗:
首先,引入依赖包:
compile 'com.android.support:support-annotations:22.0.0'
然后就可以在代码中使用了:
public class MainActivity extends Activity {
public static final int MALE = 0;
public static final int FEMALE = 1;@Override
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main_activity);Person person = new Person();person.setSex(MALE);((Button) findViewById(R.id.test)).setText(person.getSexDes());
}
class Person {@SEXprivate int sex;public void setSex(@SEX int sex) {this.sex = sex;}@SEXpublic int getSex() {return sex;}public String getSexDes() {if (sex == MALE) {return "男";} else {return "女";}}
}@IntDef({MALE, FEMALE})
@Retention(RetentionPolicy.SOURCE)
public @interface SEX {
}
}
这里我们可以看到,@SEX
注解可以放到属性定义,参数,返回值等地方对数据类型进行限制。如果我们直接赋值一个Int
参数给setSex()
,IDE会直接报错:
![](http://upload-images.jianshu.io/upload_images/699911-ad5fd1b83f330063.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
然而如果你曾经看过这篇文档,你就知道,这仅仅是AS的静态代码检查而已,就像上面的代码,尽管IDE已经报错,你还是可以直接Run Application
,而且也可以成功运行。这倒是可以理解,因为我们这个注解本身就是RetentionPolicy.SOURCE
,只能给代码检查工具使用。
它对应的AS代码检查项如下:
![](http://upload-images.jianshu.io/upload_images/699911-fd6e28d7b677dab6.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
在lint中,对应的选项是WrongConstant
:
WrongConstant
Summary: Incorrect constant
Priority: 6 / 10
Severity: Error
Category: Security
Ensures that when parameter in a method only allows a specific set of
constants, calls obey those rules.
1、引入注解的support包,可以使用provided
,避免打入正式发布的APK中。
2、对于是否替换Android中的枚举,需要分不同的情况,比如上文中提及的场景也是枚举使用的大部分场景:仅仅提供类型安全,那么我们可以考虑通过注解来替换;如果我们需要将数据和枚举常量关联起来,在枚举中声明域,然后编写一个带有数据的构造器,那么还是考虑把枚举留下吧。
参考:http://www.jianshu.com/p/f8ac84a3e3c1
Android代码替代枚举的正确之道相关推荐
- android代码编写,如何正确编写Android代码
你直接使用Android代码来构造和创建应用程序用户界面,下面文章进行详细的对Android代码进行详细的说明描述. 在你的Android代码中使用这个类作为你个比较快捷的方法去访问你的工程能够中的资 ...
- Android代码规约
Android代码规约 写在前面的话 对软件来说,适当的规范和标准绝不是消灭代码内容的创造性.优雅性,而是限制过度个性化,以一种普遍认可的统一方式一起做事,提升协作效率,高效协作即降低协同成本.所谓无 ...
- 读书笔记:编写高质量代码--web前端开发修炼之道(二:5章)
读书笔记:编写高质量代码--web前端开发修炼之道 这本书看得断断续续,不连贯,笔记也是有些马虎了,想了解这本书内容的童鞋可以借鉴我的这篇笔记,希望对大家有帮助. 笔记有点长,所以分为一,二两个部分: ...
- 编写高效的Android代码
编写高效的Android代码 转自:http://www.chinaup.org/docs/toolbox/performance.html 介绍 对于如何判断一个系统的不合理,这里有两个基本的原则: ...
- Android代码混淆方法,Android 代码混淆零基础入门
内容提要 本篇文章主要有三个部分,让读者读完后能自己写规则混淆项目 对Android代码怎么开启混淆做一个简单的介绍. 对混淆规则做一个简单介绍: 在混淆过后Crash日志反推代码工具retrace. ...
- Android 代码混淆Proguard
混淆概念 Android代码混淆,又称Android混淆,是伴随着Android系统的流行而产生的一种APP保护技术,用于保护APP不被破解和逆向分析. 在Android的具体表现就是打包时,将项目里 ...
- android动态设置src,Android 代码里设置ImageView的src和background
设置ImageView的src: image.setImageDrawable(getResources().getDrawable(R.drawable.blackk)); String path= ...
- Android 系统性能优化(42)---Android代码内存优化建议-Android资源篇
Android代码内存优化建议-Android资源篇 这篇文章主要介绍在实际Android应用程序的开发中,容易导致内存泄露的一些情况.开发人员如果在进行代码编写之前就有内存泄露方面的基础知识,那么写 ...
- android 代码浅黄色,Android工程中让人很不爽的“黄色警告”
一些黄色警告 在XML中: 警告信息:[I18N] Hardcoded string "Button" , should use @string resource 意思大概是: 按 ...
最新文章
- 干货|简单理解逻辑回归基础
- 【渝粤教育】国家开放大学2018年秋季 0062-22T港台文学专题讲座 参考试题
- mysql把两个查询的结果合并为一个结果
- 实践项目2 图书管理系统
- 运行命令、文件扩展名速查、Windows运行命令大全
- ember controller内调用save修改model数据时出现null的解决方案
- 新版UNITY游戏(IL2CPP类型)使用内嵌型机器翻译插件XUnity.AutoTranslator的食用方法
- php翻译英文 保留格式,页面如何实现自动翻译成英文
- 如何做一场视频投票活动
- java库存同步思路_这个是真的厉害,高并发场景下的订单和库存处理方案,讲的很详细了!...
- 使用Hbuilder封装APP(含配置证书)详细图文教程
- dataframe排序 pd.rank()
- 女性内分泌失调的8种症状
- Field usersMapper in com.example.test.impl.UsersServiceImpl required a bean of type ‘com.example.tes
- XML中配置网易云歌手详情滑动效果
- 软件测试行业发展前景分析
- 阿里云无影云电脑ubantu中文失败解决方案
- 六、注册页功能制作《仿淘票票系统前后端完全制作(除支付外)》
- 那种计算机能玩游戏,我的电脑能玩什么游戏?
- 实验吧WP(密码学部分)【变异凯撒,传统知识+古典密码,try them all,trival】
热门文章
- 计算机毕业设计 SpringBoot+Vue食商城系统 零食购物平台系统 网红零食店铺线上交易平台系统Java Vue MySQL数据库 远程调试 代码讲解
- html字两边的横线_css怎么在文字两边加上横线
- 怎么找回回收站删除的文件
- 野三坡白草畔的一揽三山景点
- Python下载库的外部源
- ORA-02409:超时:分布式事务处理等待锁定ORA-02063
- 派森诺基因云:从柱形图到圆柱图
- Win11账户被锁定如何解决?Win11账户锁定解决方法教学
- 送2张200元个人知识管理课程抵用券
- Java中Map的三种遍历方式:keySet、 entrySet、forEach