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

这是一段很常见的使用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的类型检查来完成:
- 添加Gradle文件 , 按自己的版本号修改:
dependencies { compile ‘com.android.support:support-annotations:24.2.0’ }
- 编写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......)之类的 , 还是选择枚举吧
网友评论