Android开发之枚举(Enum)在实际项目中的应用

2025-12-01 15:38:05

1、枚举不同于类和接口,类用class标识,接口用interface标识,而枚举用enum标识,枚举名建议带上Enum后缀,枚举成员名称需要全大写,单词间用下划线隔开。

以一年四季为例,学习枚举的基本用法,创建枚举SeasonEnum,包括成员:SPRINT、SUMMER、AUTUMN、WINTER,代码如下:

Android开发之枚举(Enum)在实际项目中的应用

2、调用的方式,代码如下:

Android开发之枚举(Enum)在实际项目中的应用

3、判断两个枚举成员是否相等,用等号(==),代码如下:

Android开发之枚举(Enum)在实际项目中的应用

4、运行demo,控制台输出:秋天,夕阳西下,断肠人在天涯

到此,我们学会了枚举的基本用法,接下来再看一周七天的例子,制定一周的工作计划,创建枚举WeeklyPlanEnum,包括成员:MON、TUES、WED、THUR、FRI、SAT、SUN,代码如下:

Android开发之枚举(Enum)在实际项目中的应用

5、因为我们创建了带参数的构造方法,所以可以往MON里面传入参数(也必须传参),制定好一周的工作计划,就老老实实按计划行事,调用getPlan()方法,查看具体的工作内容,代码如下:

Android开发之枚举(Enum)在实际项目中的应用

6、运行demo,控制台输出:周五:学习混淆Android项目的资源文件、属性文件

从上面两个例子,你是否可以总结出一些共同的特点,是否明白什么时候使用枚举?如果还是不明白,我们再看一个例子:本学期,计算机科学与技术专业学院已经评选出三名优秀学生干部,学生信息包括:学号(num)、姓名(name)、专业(profession),现在需要根据学号查询学生的其他信息,使用枚举实现,代码如下:

Android开发之枚举(Enum)在实际项目中的应用

Android开发之枚举(Enum)在实际项目中的应用

7、调用如下方法,查询三好学生的其他信息,代码如下:

Android开发之枚举(Enum)在实际项目中的应用

8、运行demo,控制台打印出:

Android开发之枚举(Enum)在实际项目中的应用

9、从上面三个例子,可以总结:当你需要在一个可选区域内,选择某一个选项,获取该选项对应的属性或方法,可以考虑用枚举

例子一:一年有四个季节,是一个可选区域,可以选择其中一项,然后获取描述该季节的诗句。

例子二:一周有七天,是一个可选区域,选择其中一天,获取当天的工作安排。

例子三:评选出的三个优秀学生,是一个可选区域,可以根据学号查询某个学生是否是优秀学生干部,并返回学生的其他信息。

1、查看枚举支持调用哪些方法,在Android Studio快速按下两下shift,查找Enum类源码

所有使用enum标识的,统一继承自Enum抽象类,也就继承Enum类的方法和属性,枚举支持调用的方法除了继承的方法外,还可以调用添加的方法。

查看JDK 1.8包的Enum源码,如下图:

Android开发之枚举(Enum)在实际项目中的应用

2、绿色符合标识public修饰的方法,表示Enum的子类可以调用的方法,现在来学习每个继承方法的作用,以第三个例子作为测试,看到Enum抽象类的构造方法,代码如下:

Android开发之枚举(Enum)在实际项目中的应用

3、开发者不能在外部包中调用protected修饰的构造方法,所以可以猜测它可能在程序内部调用,实际上代码被编译器执行,为响应我们用enum标识的枚举类型时调用Enum(String,int)构造方法,而我们声明的成员:ZHAOYUN、ZHANGFEI、LIUBEI,将被以字符串name的形式传入,ordinal从0开始依次分配,其他方法的使用情况如下:

4、name(),返回枚举常量的名字,测试代码如下:

Log.d(TAG, "test: "+ExcellentStudentEnum.LIUBEI.name());

运行demo,控制台打印:

Android开发之枚举(Enum)在实际项目中的应用

5、ordinal(),返回枚举序数,测试代码如下:

Log.d(TAG, "test: "+ExcellentStudentEnum.LIUBEI.ordinal());

运行demo,控制台打印:

Android开发之枚举(Enum)在实际项目中的应用

6、toString(),返回枚举常量的名字,测试代码如下:

Log.d(TAG, "test: "+ExcellentStudentEnum.LIUBEI.toString());

运行demo,控制台打印:

Android开发之枚举(Enum)在实际项目中的应用

7、equals(Object other),比较传入的对象是否等于当前的枚举,测试代码如下:

Log.d(TAG, "test: "+ExcellentStudentEnum.LIUBEI.equals("LIUBEI")); 

Log.d(TAG, "test: "+ExcellentStudentEnum.LIUBEI.equals(ExcellentStudentEnum.LIUBEI));

运行demo,控制台打印:

Android开发之枚举(Enum)在实际项目中的应用

8、hashCode(),返回当前枚举常量的哈希码,测试代码如下:

Log.d(TAG, "test: "+ExcellentStudentEnum.LIUBEI.hashCode());

运行demo,控制台打印:

Android开发之枚举(Enum)在实际项目中的应用

9、compareTo(E o),比较当前枚举对象和传入的对象的顺序对象,返回一个负整数、0或正整数

Log.d(TAG, "test: "+ExcellentStudentEnum.LIUBEI.compareTo(ExcellentStudentEnum.ZHAOYUN)); 

Log.d(TAG, "test: "+ExcellentStudentEnum.ZHAOYUN.compareTo(ExcellentStudentEnum.ZHAOYUN)); 

Log.d(TAG, "test: "+ExcellentStudentEnum.ZHAOYUN.compareTo(ExcellentStudentEnum.ZHANGFEI));

运行demo,控制台打印:

Android开发之枚举(Enum)在实际项目中的应用

10、getDeclaringClass(),返回enum标识的枚举的Class名称,测试代码如下:

Log.d(TAG, "test: "+ExcellentStudentEnum.LIUBEI.getDeclaringClass());

运行demo,控制台打印:

Android开发之枚举(Enum)在实际项目中的应用

11、valueOf(Class<T>,String), 这是一个类方法,返回枚举常量的名字,测试代码如下:

Log.d(TAG, "test: "+ExcellentStudentEnum.valueOf(ExcellentStudentEnum.LIUBEI.getDeclaringClass(),"LIUBEI")); 

Log.d(TAG, "test: "+ExcellentStudentEnum.valueOf(ExcellentStudentEnum.LIUBEI.getDeclaringClass(),"ZHANGFEI")); 

Log.d(TAG, "test: "+ExcellentStudentEnum.valueOf(ExcellentStudentEnum.LIUBEI.getDeclaringClass(),"ZHAOYUN"));

运行demo,控制台打印:

Android开发之枚举(Enum)在实际项目中的应用

12、values(),这是一个隐藏起来的类方法,因为并不继承Enum类,同时在enum标识的枚举,有没有声明该方法,却可以使用,所以说values()是一个隐藏的类方法,还是很合适的,测试代码如下:

for (ExcellentStudentEnum student : ExcellentStudentEnum.values()) { 

 Log.d(TAG, "test: " +student.getProfession()); 

}

运行demo,控制台打印:

Android开发之枚举(Enum)在实际项目中的应用

13、valueOf(String),这是一个隐藏起来的类方法,返回指定枚举常量名字的枚举对象,测试代码如下:

Log.d(TAG, "test: "+ExcellentStudentEnum.valueOf("LIUBEI").getNum()); 

Log.d(TAG, "test: "+ExcellentStudentEnum.valueOf("ZHAOYUN").getProfession());

运行demo,控制台打印:

Android开发之枚举(Enum)在实际项目中的应用

14、到此,我们完成enum标识的枚举支持调用方法的学习,其中包括继承自Enum抽象类的1-8个方法,以及隐藏的两个类方法:values()、valueOf(String),对枚举的用法有了更深的认识。

1、阅读Enum抽象类的构造方法说明,我们知道了编译器在编译期间,读取enum关键字标识的枚举,内部调用Enum构造方法,将成员名称name以字符串的形式传入,ordinal从0开始分配序数,最终转换普通的类。

结合TeachCourse个人的经验,枚举可以说是一个固定的模板,编译器负责转换,转换的过程在编译器内部发生,我们无法觉察和看到,更增加了枚举的神秘感,从本质上来说,枚举也是一个类,接下来我们用第三个例子测试,用类实现枚举的功能,代码如下:

Android开发之枚举(Enum)在实际项目中的应用

Android开发之枚举(Enum)在实际项目中的应用

2、除了没有继承Enum抽象类的方法外,ExcellentStudent实现了枚举自身的其他方法,同时添加两个类方法::values()、valueOf(String),最终实现的功能和枚举差不多哈哈。

调用ExcellentStudent的方法过程如下所示:

Android开发之枚举(Enum)在实际项目中的应用

3、运行demo,控制台打印:

Android开发之枚举(Enum)在实际项目中的应用

4、到此,完成了用类实现枚举的功能,对比了之后,你会发现枚举的简单、方便。

1、我们知道在一个可选区域内选择其中一个成员,或者从可选区域查询符合的一个成员,这个时候考虑使用枚举,阅读一些开源项目源码,多少会发现枚举的影子,比如图片加载框架:universal-image-loader,在ImageDownloader这个接口内声明了一个枚举Scheme,源码如下:

Android开发之枚举(Enum)在实际项目中的应用

Android开发之枚举(Enum)在实际项目中的应用

2、该枚举列举了universal-image-loader支持加载的几种类型图片,以http开头的、https开头的、file开头的、content开头的和assets开头的,添加的ofUri(String),用于查询当前传入的图片地址是否属于可选区域内的一种,将加深我们对枚举的理解、使用。

枚举在实际项目中应用的例子,还有很多,比如TeachCourse项目中引用的友盟分享功能:SHARE_MEDIA

Android开发之枚举(Enum)在实际项目中的应用

Android开发之枚举(Enum)在实际项目中的应用

3、网易即时通信demo Tab导航:MainTab

Android开发之枚举(Enum)在实际项目中的应用

Android开发之枚举(Enum)在实际项目中的应用

4、阅读源码后,你会发现枚举在项目中的应用涉及的用法基本一样,都包含在前面的例子中。

1、本文从什么时候使用枚举、枚举支持调用的方法、用类实现枚举的功能和枚举在实际项目的应用四个方面,深入理解枚举的用法,加深了对枚举的认识,demo包含多个枚举的例子,可以方便下载阅读。

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢