enums在android中的问题及替代方案

2018-09-10  本文已影响0人  森林深处没有鹿

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。

上一篇下一篇

猜你喜欢

热点阅读