业务场景:
有些时候我们有一排相同类型的东西需要展示,当时每个子项可能包含具体的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 运行时动态注解,生命周期一直程序运行时都存在,常用于自动注入