Android 枚举类型

本文介绍了在Android开发中如何利用枚举类型进行高效且安全的编程实践,包括枚举的基本用法、实现单例模式、自定义属性及方法等,并探讨了枚举类型的内存占用情况。同时,还介绍了Android官方推荐的使用注解来增强枚举类型的可维护性和可读性。

业务场景:

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

 


 

 

 
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值