美文网首页程序员
Android中使用枚举

Android中使用枚举

作者: MinuitZ | 来源:发表于2018-02-26 14:45 被阅读16次

首先我先上一幅图,强行引起大家的共鸣



这是一段很常见的使用if来判断逻辑的代码,但是如果判断的时候写错了一个字符那岂不是很难排查?而且给别人维护也会带来很大的困难,并且类型安全得不到保障。此时,你需要枚举来帮你了。

Enum

枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法。

用法1:作为常量集
//准备一个枚举类, 类型中支持三个变量
public enum Kind {
    格斗家,圣职者,鬼剑士
}

然后编写接收参数的方法,注意接收的参数为枚举类,这样就可以在枚举变量中限制使用到的变量, 保障了类型安全

protected void testOne(Kind kind) {
        Log.e(TAG, "testOne: " + kind);
}

public void test() {
        testOne(Kind.格斗家);
}

protected void testTwo(Kind kind){
        switch (kind){
            case 圣职者:
            case 格斗家:
            case 鬼剑士:
        }
    }
用法2:向枚举中添加新方法

这种情况下必须将构造函数的数据结构与枚举元素的结构一致. 如:Li("xxx",123), 那么构造函数就必须是String和int ;同样 ,这里的两个变量name和age也必须经过构造函数来赋值.

public enum Person {
    Li("Lili",12),Zi("Lili",12),Br("Lili",12),Dv("Lili",12);

    private String name;
    private int age;

    Person(String name,int age){
        this.name=name;
        this.age=age;
    }

    // get set 方法
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }

 //从姓名来查找Person
    public Person getPerson(String name){
        for (Person p:Person.values()){
            if (p.name.equals(name)){
                return p;
            }
        }
        return null;
    }
}
---
Log.e("onCreate: ", Person.Br.getName());

使用 Enum 的缺点

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

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

如果你的应用使用很多的 Enum ,最好使用Integer 或 String 替代他们,但是这样还会有各种各样的不方便.

基于此 , 我们可以使用annotation的类型检查来完成:

  1. 添加Gradle文件 , 按自己的版本号修改:
    dependencies { compile ‘com.android.support:support-annotations:24.2.0’ }
  2. 编写Depart类作为枚举的替代 , 并在其中加入如下的限制:
public class Depart {
    public static final int MALE = 0001;
    public static final int FEMALE = 0002;

    //值约束
    @IntDef({MALE, FEMALE})
    //表示注解所存活的时间: 源码,而非运行时
    @Retention(RetentionPolicy.SOURCE)
    //定义注解接口
    public @interface SEX {
    }

    //对sex变量有约束
    @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 "女";
        }
    }
}

这样在使用Depart这个类的时候就会在编译阶段展示出限制 , 如图所示:



这样就代替了基本的枚举的使用.
但是如果必须使用到略复杂的数据结构 , 比如Li(1,2,3,4,5......)之类的 , 还是选择枚举吧

相关文章

网友评论

    本文标题:Android中使用枚举

    本文链接:https://www.haomeiwen.com/subject/dydexftx.html