Android中的枚举

Android中的枚举,第1张

在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(枚举类)
枚举类的使用方法
感谢以上两位博主的文章,让我认识了枚举小伙伴

以上就是枚举在安卓项目中的实战效果,感谢观看!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/992211.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-21
下一篇 2022-05-21

发表评论

登录后才能评论

评论列表(0条)

保存