码迷,mamicode.com
首页 > 移动开发 > 详细

Android之使用枚举利弊及替代方案

时间:2018-02-13 18:52:18      阅读:270      评论:0      收藏:0      [点我收藏+]

标签:就是   auto   prot   protect   图片   layout   文件的   public   提示   

Android上不应该使用枚举,占内存,应该使用@XXXDef注解来替代

使用 Enum 的缺点

每一个枚举值都是一个对象,在使用它时会增加额外的内存消耗,所以枚举相比与 Integer 和 String 会占用更多的内存。

较多的使用 Enum 会增加 DEX 文件的大小,会造成运行时更多的开销,使我们的应用需要更多的空间。

如果你的应用使用很多的 Enum ,最好使用Integer 或 String 替代他们,但是这样还会有问题。

既然都说到这个份上了,那么有什么比较好的解决方法呢?

 1 public class SexTest{
 2 
 3     public static enum Sex {
 4         MAN, WOMEN
 5     }
 6 
 7     private Sex sex;
 8     //设置性别
 9     public void setSex(Sex sex){
10         this.sex = sex;
11     }
12 
13     //获取性别
14     public String getSex(){
15         if(Sex.MAN == sex) return "";
16         if(Sex.WOMEN == sex) return "";
17         return "未知";
18     }
19 
20     public static void main(String[] args){
21         //这里的入参必须为Sex枚举类中的其中一个枚举常量
22         //绝对不允许输入没有再Sex枚举里面定义的常量
23         setSex(Sex.MAN);
24         String resultSex = getSex();
25         System.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会直接报错:

 
技术分享图片
 

Android之使用枚举利弊及替代方案

标签:就是   auto   prot   protect   图片   layout   文件的   public   提示   

原文地址:https://www.cnblogs.com/ganchuanpu/p/8447033.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!