业务场景:

有些时候我们有一排相同类型的东西需要展示,当时每个子项可能包含具体的id。名称,简介。为了方便管理和修改。我们把它放在枚举类型中,方便管理。

Android enum

1)替换场景

   通过enum关键字来实现枚举,在枚举中需要注意的有:

        1. 枚举中的属性必须放在最前面,一般使用大写字母表示

        2. 枚举中可以和java类一样定义方法

        3. 枚举中的构造方法必须是私有的

        4.可以在枚举属性后面添加()来调用指定参数的构造方法,添加{}来实现其对应的匿名内部类

RED(30){ public TrafficLamp nextLamp() { return GREEN ; } }

原:   

public static final int COLOR_RED = 0;
     public static final int COLOR_GREEN =1;
     public static final int COLOR_BLUE = 2;

替换后:

public enum ColorEnum{
     RED,
     GREEN,
     YELLOW
 }

使用枚举类型可以提高代码的安全性(防止输入枚举之外的值)和可读性(在打印日志时)。另外注意两个点:上述的ColorEnum实质上会在编译时转换成继承java.lang.enum的类,所以ColorEnum不可继承自其它的类。此外,被编译后的ColorEnum会被标记为final,即不可被继承

2)枚举类型实现单例

public enum NetworkManager {
    instance;
          xxxxx
}

使用 

NetworkManager.instance.xxxx


enum 对象的常用方法介绍: 

int compareTo(E o) 
           比较此枚举与指定对象的顺序。

 Class<E> getDeclaringClass() 
           返回与此枚举常量的枚举类型相对应的 Class 对象。

 String name() 
           返回此枚举常量的名称,在其枚举声明中对其进行声明。

 int ordinal() 
           返回枚举常量的序数(它在枚举声明中的位置,其中初始常量序数为零)。

 String toString()
           返回枚举常量的名称,它包含在声明中。

 static <T extends Enum<T>> T valueOf(Class<T> enumType, String name) 
           返回带指定名称的指定枚举类型的枚举常量给 enum 对象加一下 value 的属性和 getValue() 的方法:
    MON(1), TUE(2), WED(3), THU(4), FRI(5), SAT(6) ,
     SUN(0) {
         @Override
         public boolean isRest() {
             return true;
         }
     };
  
     private int value;
  
     private EnumTest(int value) {
         this.value = value;
     }
  
     public int getValue() {
         return value;   }


可以把 enum 看成是一个普通的 class,它们都可以定义一些属性和方法,不同之处是:enum 不能使用 extends 关键字继承其他类,因为 enum 已经继承了 java.lang.Enum(java是单一继承)

Android 中的 Enum 到底占多少内存?该如何用?

占用了很大的 dex 文件,占用很多内存

假设有 n 个枚举值,仅仅考虑枚举类,静态占用的内存,n 个引用 + n 个数组 + 24 空数组长度: 8n + 24。

而对于 n 个值的常量,则有 4n 字节。当 n 很大时,这样的关系是两倍,但是枚举引用所指向的内存(retained heap)没有考虑进来。

Android中使用枚举的正确姿势

Android官方引入了两个注解,分别是StringDef和IntDef。具体方法见下:
首先引入依赖:

compile 'com.android.support:support-annotations:25.1.0'

public interface ISearchTypeClickListener {

    @IntDef({Type.hot, Type.recommend, Type.result, Type.history})

    @Retention(RetentionPolicy.SOURCE)
    @interface Type {
        int hot = 0x110;
        int recommend = 0x111;
        int result = 0x112;
        int history = 0x113;
    }

    void itemClick(@Type int fromType, int position, Program program);

}

注解生命周期

• RetentionPolicy.SOURCE 源码注解,编译成.class文件后注解就不存在,用来提示开发者
• RetentionPolicy.CLASS CLASS汇编注解,编译成.class文件后注解也还存在,用于自动生成代码
• RetentionPolicy.RUNTIME 运行时动态注解,生命周期一直程序运行时都存在,常用于自动注入