今日长缨在手,何时缚住苍龙。这篇文章主要讲述Android之使用枚举利弊及替代方案相关的知识,希望能为你提供帮助。
android上不应该使用枚举,占内存,应该使用@XXXDef注解来替代
使用 Enum 的缺点
每一个枚举值都是一个对象,在使用它时会增加额外的内存消耗,所以枚举相比与 Integer 和 String 会占用更多的内存。
【Android之使用枚举利弊及替代方案】较多的使用 Enum 会增加 DEX 文件的大小,会造成运行时更多的开销,使我们的应用需要更多的空间。
如果你的应用使用很多的 Enum ,最好使用Integer 或 String 替代他们,但是这样还会有问题。
既然都说到这个份上了,那么有什么比较好的解决方法呢?
1 public class SexTest{ 2 3public static enum Sex { 4MAN, WOMEN 5} 6 7private Sex sex; 8//设置性别 9public void setSex(Sex sex){ 10this.sex = sex; 11} 12 13//获取性别 14public String getSex(){ 15if(Sex.MAN == sex) return "男"; 16if(Sex.WOMEN == sex) return "女"; 17return "未知"; 18} 19 20public static void main(String[] args){ 21//这里的入参必须为Sex枚举类中的其中一个枚举常量 22//绝对不允许输入没有再Sex枚举里面定义的常量 23setSex(Sex.MAN); 24String resultSex = getSex(); 25System.out.println("resultSex: " + resultSex); 26//输出:resultSex: 男 27} 28 }
解决方案
既然是因为参数的类型太泛了造成的类型不安全,那么我只要将参数限定在某一个类型集合里面,不就大功告成了?!
是滴,一下就是要将的@IntDef/@StringDef + @interface来进行限定参数。
首先你要在build.gradle文件中添加依赖
dependencies { compile ‘com.android.support:support-annotations:24.2.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 { @SEX private int sex; public void setSex(@SEX int sex) { this.sex = sex; } @SEX public int getSex() { return sex; } public String getSexDes() { if (sex == MALE) { return "男"; } else { return "女"; } } }@IntDef({MALE, FEMALE}) @Retention(RetentionPolicy.SOURCE) public @interface SEX { } }
如果我们尝试在调用setSex()方法的时候,传入不在限定之内的值,那么编译就不会通过,有错误提示。同理,我们也可以使用@StringDef。
这里我们可以看到,
@SEX
注解可以放到属性定义,参数,返回值等地方对数据类型进行限制。如果我们直接赋值一个Int
参数给setSex()
,IDE会直接报错:文章图片
推荐阅读
- jmeter链接手机录制某APP脚本
- 事务与隔离级别------《Designing Data-Intensive Applications》读书笔记10
- Android中文API-ViewStub
- Android 面试收集录5 消息机制
- Android复制粘贴剪切板内容的一种方法
- Computer Science - CS:APP - 2.1 信息存储
- 备份Android机上的照片
- [Android] Toast问题深度剖析
- Android与H5混合开发