enums在android中的问题及替代方案
java中enums的描述:
Enum Types. An enum type is a special data type that enables for a variable to be a set of predefined constants. The variable must be equal to one of the values that have been predefined for it.
简而言之,enums将变量值限定在一组数值内, 使得代码更易读更安全。
使用场景和用法
当变量的值在有限的范围内,如性别里只有“男”和“女”,我们就可以通过enum来约束变量值:
public enum Sex{
MAN, WOMAN
}
定义之后,Sex类型的变量值就被限定在了man和woman两个值中,赋其它值时会直接报错。
通过enums我们可以写出易于阅读的数据安全的代码。
应该说明的是,enums类型是一种基本数据类型,而不是一种构造类型,因为它不能再分解为任何基本类型。
但是google并不建议在android中使用enums,理由是占用内存多(Enums often require more than twice as much memory as static constants.)。
为什么enums会占用更多的内存呢?
在我们使用enums时,会生成一个state final 的类,类名是声明的enums的名称,成员常量名为enums元素的类对象,这使得enums比正常的static final 的变量大了1到13倍。
Sex生成的state类如下:
public final class Sex extends enum{
public static final Sex MAN;
public static final Sex CAT;
private static final Sex $VALUES[];
static {
MAN = new Animal("MAN", 0);
WOMAN = new Animal("WOMAN", 1);
$VALUES = (new Animal[] {
MAN, WOMAN
});
}
}
那么Android中我们使用什么方式代替enums呢?
其实如果是参数的类型太宽泛造成类型不安全,我们可以将参数限定在某一个类型里,通过@intDef @StringDef + @interface 就可以限定参数;
下面来看下使用步骤:
1,在build.gradle文件中添加依赖
dependencies { compile ‘com.android.support:support-annotations:24.2.0’ }
2,使用代码:
public class SexTest {
private final int MAN = 101, WOMEN = 102;
//限定为MAN,WOMEN
@IntDef({MAN, WOMEN})
@Retention(RetentionPolicy.SOURCE)
public @interface Sex {
}
public void setSex(@Sex int sex){
this.sex = sex;
public static void main(String[] args){
setSex(MAN);
}
}
至此,我们就使用TypeDef 注解库 + 接口替代了enums。