枚举对比常量的一个优势是枚举可以限定输入的内容。比如人的性别只能有男和女,如果你定义数据类型为常量的男或者女,那输入的数据内容也可能是“人妖”,这个时候编译并不会产生报错。但如果你定义的数据类型是枚举,那编译器会对不属于男或者女的内容进行编译报错提示。看个小例子:
public class Person {
private Gender mGender;
public void setGender(Gender gender) {
mGender = gender;
}
enum Gender{
MALE,
FEMALE;
}
}
方法setGender只能输入MALE或者FEMALE:
Person person = new Person();
person.setGender(Person.Gender.MALE);
person.setGender(Person.Gender.FEMALE);
枚举对比常量虽然具备这一优势,但也不能忘记它占用内存比常量大的这一劣势。那是否可以基于常量来自定义一种数据类型,从而实现枚举的效果呢?那肯定是可以的,下面就利用Android中的@IntDef @StringDef基于常量实现像枚举一样的功能。
public class Constant {
public static final String MALE = "MALE";
public static final String FEMALE = "FEMALE";
@Documented //开启doc文档
@StringDef({MALE,FEMALE}) //注解的内容
@Target({ElementType.FIELD,ElementType.METHOD,ElementType.PARAMETER}) //表示注解的范围:成员注解,方法注解,参数注解
@Retention(RetentionPolicy.SOURCE) //标记注解级别,只停留在源码中,在class字节码中不包含
public @interface Gender{} //定义新的注释类型
}
public class Person {
private @Constant.Gender String mGender;
public void setGender(@Constant.Gender String gender) {
mGender = gender;
}
public @Constant.Gender String getGender() {
return mGender;
}
}
其实你看上面的内容就会发现,其实没有定义一个新的数据类型,只是新定义了一个注解,限制了注解内容的范围。当你输入注解内容之外的内容时就会编译器报错,如下图所示:

@IntDef 同理就不再多说了。
参考:
https://blog.csdn.net/chenliguan/article/details/84705465
https://blog.csdn.net/luoguopeng/article/details/72781080
https://blog.csdn.net/codingismylife/article/details/49702525
网友评论