在ARouter源码中发现使用到了枚举,说明枚举并不是不常见的,刚好枚举在我的视野中处于盲区,于是打算周末加班给拿下,扩展视野。
了解枚举之前首先说一下什么是常量和变量:
常量 - 声明后无法改变的量
变量 - 声明赋值后可以改变的量
枚举为常量,我们平时使用常量的地方都可以用枚举来代替!
可怕吗,敲了这么多代码,我竟然连这点常识都不知道!因为我只在书本中了解过,并没有真正应用过。
既然可以用枚举去代替我们平时的常量肯定是有原因的(不要为了用而用,根据具体需求,具体玩耍),为什么呢?
相比我们平时用到的方式来讲
常量:
1. 类型不安全。若一个方法中要求传入季节这个参数,用常量的话,形参就是int类型,开发者传入任意类型的int类型值就行,但是如果是枚举类型的话,就只能传入枚举类中包含的对象。
2. 没有命名空间。开发者要在命名的时候以SEASON_开头,这样另外一个开发者再看这段代码的时候,才知道这四个常量分别代表季节。
public static final int SEASON_SPRING = 1;
枚举: 更安全、更直观、更便捷。
public enum MyEnum {
A,B,C
}
为什么说枚举是常量呢?
Cannot assign a value to final variable 'FRIDAY
无法为最终变量“FRIDAY”赋值
枚举既然可以代替常量,他肯定就有类似于以及胜似于常量的写法,这里介绍两种写法
1. 简约版
基本简约版以及完全满足大部分的需求
public enum SeasonEnum {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}
中间用逗号分隔,末尾可加逗号或者分号,可不加,任你处置。
enum 修饰符,地位与class等同级别
SeasonEnum.FRIDAY
在需要的时候直接拿来用就可以了,和常量一样,优点呢,如上所述,如果是常量的话需要一个类型和值,拖家带口的,此时这个值在源头变了,如果你此时有个判断那就凉凉了,与原来的不一样了呢,但是如果是枚举,相当于单身一人,哎,我变你就得变。。。就是这么恶心心
当然不会就这么个功能,看下图,话不多说了,都在备注里了,嘿嘿嘿,真省事,这是我在代码中实际运行的效果哦。
//获取当前枚举的所有常量(以数组的形式)
Log.e(TAG, "onClick:SeasonEnum.values()->"+SeasonEnum.values());
//获取当前枚举的所有常量(将数组转变为字符串的形式)
Log.e(TAG,"onClick:Arrays.toString(SeasonEnum.values())>"+Arrays.toString(SeasonEnum.values());
//通过枚举名称获取当前枚举常量
Log.e(TAG,"onClick:SeasonEnum.valueOf(SeasonEnum.MONDAY.toString())>"+SeasonEnum.valueOf(SeasonEnum.MONDAY.toString()));
//通过枚举名称获取当前枚举常量并以字符串的形式打印
Log.e(TAG, "onClick:SeasonEnum.valueOf(SeasonEnum.MONDAY.toString()).toString()->"+SeasonEnum.valueOf(SeasonEnum.MONDAY.toString()).toString());
//获取当前枚举内的具体某个常量
Log.e(TAG, "onClick:SeasonEnum.FRIDAY->"+SeasonEnum.FRIDAY);
//以字符串的形式输出当前枚举常量
Log.e(TAG, "onClick:SeasonEnum.FRIDAY.name()->"+SeasonEnum.FRIDAY.name());
//获取当前枚举常量在当前枚举类中下标位置(0开始)
Log.e(TAG, "onClick:SeasonEnum.FRIDAY.ordinal()->"+SeasonEnum.FRIDAY.ordinal());
//比较两个枚举常量之间的位置(以下标位置进行比较)
Log.e(TAG, "onClick:SeasonEnum.FRIDAY.compareTo(SeasonEnum.MONDAY)->"+SeasonEnum.FRIDAY.compareTo(SeasonEnum.MONDAY));
//以枚举的Class对象和枚举名称获取枚举常量
Log.e(TAG, "onClick:SeasonEnum.valueOf(SeasonEnum.class,SeasonEnum.FRIDAY.name())->"+SeasonEnum.valueOf(SeasonEnum.class,SeasonEnum.FRIDAY.name()));
onClick:SeasonEnum.values()->[Lcom.example.anenum.SeasonEnum;@8b6c4ad
onClick:Arrays.toString(SeasonEnum.values())->[MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY]
onClick:SeasonEnum.valueOf(SeasonEnum.MONDAY.toString())->MONDAY
onClick:SeasonEnum.valueOf(SeasonEnum.MONDAY.toString()).toString()->MONDAY
onClick:SeasonEnum.FRIDAY->FRIDAY
onClick:SeasonEnum.FRIDAY.name()->FRIDAY
onClick:SeasonEnum.FRIDAY.ordinal()->4
onClick:SeasonEnum.FRIDAY.compareTo(SeasonEnum.MONDAY)->4
onClick:SeasonEnum.valueOf(SeasonEnum.class,SeasonEnum.FRIDAY.name())->FRIDAY
以上是简约版
2.豪华版
相对于简约版,豪华版就显得有那么一丢丢复杂,但是又不复杂,就是写方法,获取对应的值嘛
public enum Number {
//必须在C位,人家是主体
A("我是A",1),B("我是B",2),C("我是C",3);
//必须位于C位之下,否则人家enum不愿意
private String str;
private int number;
//这个方法必须有的,当你不写的时候会提醒你的,不要慌
Number(String str, int number) {
this.str = str;
this.number = number;
}
//自写方法获取对应的值,不需要就不用写
public String getStr(){
return str;
}
//自写方法获取对应的值,不需要就不用写
public int getNumber(){
return number;
}
}
对应的方法
//获取当前枚举常量
Log.e(TAG, "onClick:Number.A->"+Number.A);
//获取当前枚举的所有常量(以数组的形式)
Log.e(TAG, "onClick:Number.values()->"+Number.values());
//获取当前枚举的所有常量(将数组转变为字符串的形式)
Log.e(TAG, "onClick:Number.values()->"+ Arrays.toString(Number.values()));
//获取当前枚举的某个常量内的某个值
Log.e(TAG, "onClick:Number.A.getStr()->"+Number.A.getStr());
//获取当前枚举的某个常量内的某个值
Log.e(TAG, "onClick:Number.A.getNumber()->"+Number.A.getNumber());
对应日志
onClick:Number.A->A
onClick:Number.values()->[Lcom.example.anenum.Number;@89cd373
onClick:Number.values()->[A, B, C]
onClick:Number.A.getStr()->我是A
onClick:Number.A.getNumber()->1
Enum(枚举类)
枚举类的使用方法
感谢以上两位博主的文章,让我认识了枚举小伙伴
以上就是枚举在安卓项目中的实战效果,感谢观看!