美文网首页
Android @IntDef @StringDef替代enum

Android @IntDef @StringDef替代enum

作者: 付凯强 | 来源:发表于2022-05-14 11:43 被阅读0次

枚举对比常量的一个优势是枚举可以限定输入的内容。比如人的性别只能有男和女,如果你定义数据类型为常量的男或者女,那输入的数据内容也可能是“人妖”,这个时候编译并不会产生报错。但如果你定义的数据类型是枚举,那编译器会对不属于男或者女的内容进行编译报错提示。看个小例子:

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

相关文章

网友评论

      本文标题:Android @IntDef @StringDef替代enum

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