java 枚举——java(android) 中枚举的运用和使用场景

本贴最后更新于 2676 天前,其中的信息可能已经水流花落

如果作为一个 Java 开发工程师还不了解或者还不能很好的运用枚举这个新特性的话,那你就得好好看一看枚举了。因为枚举在 java5 以后是个很好用的新特性。

基本特性:

1,enum 关键字
枚举 enum 是同 class,interface 同一级别的特性。
我们可以把 enum 看作一个抽象类,但是它又有它的不同之处,enum 不能被继承。

这一点其实在 Android 源码中就得到了证实:

Public abstract class Enum> implements Serializable,Comparable     
{   
   ...  
} 

从源码中可以看出 Enum 相当于一个抽象类。所以,enum 可以看成一个抽象类并且和 class、interface 同级。

2,枚举的定义
如何在 Enum 中定义枚举常量呢?
1,枚举常量没有任何修饰符
2,每个常量以“,”分隔,以“;”结束枚举常量的描述。
3,枚举常量必须定义在所有方法或者构造器之前。

规矩我们已经知道了,接下来就看看如何在代码里定义枚举常量了:

//枚举常量的定义可以在最后一个元素加,再加;结束。常量区分大小写
public enum OrdinaryEnums {
        red,
        RED,
        green,
        yellow,
        blue,;
    }

3,使用枚举的目的
当我们需要限制一系列变量的时候,通常想到数组或者集合;其实很多时候我们需要限定变量需要做的事情很多,或者说如果被限制的变量可以做其他事情的话就更好了,而不是单纯的一个变量(String,int,double)。

那么,枚举的作用不仅仅可以让你使用限制在一个 enum 中的变量,并且这些变量的灵活性和拓展性很好。
举例说明:
如果我们需要使用一些状态,比如一个星期的状态。
我们可以用数组:

 String[] week=new String[7];
        week[0]="星期天";
        week[1]="星期一";
        week[2]="星期二";
        week[3]="星期三";
        week[4]="星期四";
        week[5]="星期五";
        week[6]="星期六";
        String weekday=week[0];

或者集合,这些表示大家都很熟悉。
那么看看用枚举如何来写:

 public enum WeekEnums {
        //注:枚举写在最前面,否则编译出错
        Sunday,
        Monday,
        Tuesday,
        Wednesday,
        Thursday,
        Friday,
        Saturday,;

        private static String getWeek(WeekEnums weekEnums) {
            String week = null;
            switch (weekEnums) {
                case Sunday://星期天
                    week = "星期天";
                    break;
                case Monday://星期一
                    week = "星期一";
                    break;
                case Tuesday:// 星期二
                    week = "星期二";
                    break;
                case Wednesday://星期三
                    week = "星期三";
                    break;
                case Thursday:// 星期四
                    week = "星期四";
                    break;
                case Friday://星期五
                    week = "星期五";
                    break;
                case Saturday://  星期六
                    week = "星期六";
                    break;
            }
            return week;
        }
    }
//获取方式:
String weekday = WeekEnums.getWeek(WeekEnums.Friday);

可能,有人会说,这样写可是很麻烦。的确比数组或者集合麻烦了,但是它的拓展性是非常好的,因为往往我们需要的不仅仅是一个字符串,不仅仅是调用数字得到一个以供显示的星期,而是更多的逻辑处理。

我们来重写一下枚举中 getWeek 方法:

private static String getWeek(WeekEnums weekEnums) {
            String week = null;
            String behavior = null;
            switch (weekEnums) {
                case Sunday://星期天
                    week = "星期天";
                    behavior = "星期天我要去打球";//模仿一个逻辑处理
                    break;
                case Monday://星期一
                    week = "星期一";
                    behavior = "我要去上课";//模仿一个逻辑处理
                    break;
                case Tuesday:// 星期二
                    week = "星期二";
                    behavior = "我要去奶奶家";//模仿一个逻辑处理
                    break;
                case Wednesday://星期三
                    week = "星期三";
                    behavior = "我要去做义工";//模仿一个逻辑处理
                    break;
                case Thursday:// 星期四
                    week = "星期四";
                    behavior = "我要去做义工";//模仿一个逻辑处理
                    break;
                case Friday://星期五
                    week = "星期五";
                    behavior = "我要去做义工";//模仿一个逻辑处理
                    break;
                case Saturday://  星期六
                    behavior = "我要去做义工";//模仿一个逻辑处理
                    week = "星期六";
                    break;
            }
            return week;
        }

这时候,枚举的有点久体现出来了,不仅仅可以获得状态,还可以在枚举中处理逻辑。
这是数组或者集合无法做到了,而且枚举完成的逻辑不仅仅这些,还能完成更多更复杂的逻辑处理。

4,使用枚举

/**
 * 普通的枚举
 * 普通枚举在作用在于控制变量的范围,作用和数组、集合一样
 */
public class OrdinaryEnum {
    public enum OrdinaryEnums {
        red,
        green,
        yellow,
        blue,;
    }

    private void test(OrdinaryEnums ordinaryEnums) {
        switch (ordinaryEnums) {
            case red://表示红色的枚举
                break;
            case green://表示绿色的枚举
                break;
            case yellow://表示黄色的枚举
                break;
            case blue://表示蓝色的枚举
                break;
        }
    }
}
**
 * 带属性的枚举
 * 通过枚举可以获得一个相应的结果
 */
public class AattributeEnum {

    public enum AattributeEnums {
        //注:枚举写在最前面,否则编译出错
        red,
        RED,
        green,
        yellow,
        blue,;
        private static int color = Color.WHITE;

        private static int getColor(AattributeEnums aattributeEnums) {
            switch (aattributeEnums) {
                case red://表示红色的枚举
                    color = Color.RED;
                    break;
                case green://表示绿色的枚举
                    color = Color.GREEN;
                    break;
                case yellow://表示黄色的枚举
                    color = Color.YELLOW;
                    break;
                case blue://表示蓝色的枚举
                    color = Color.BLUE;
                    break;
                case RED://表示蓝色的枚举
                    color = Color.RED;
                    break;
            }
            return color;
        }
    }

    private void test() {
        int color = AattributeEnums.getColor(AattributeEnums.red);
    }
}
/**
 * 带构造器的枚举
 * 枚举的构造器类似于类的构造方法
 * 不同的是,枚举的构造器只提供给内部的枚举变量使用
 * 外界调用具体的枚举变量就相当于执行了构造器中的逻辑
 */
public class ConstructorEnum {

    public enum ConstructorEnums {
        red(Color.RED),
        green(Color.RED),
        yellow(Color.RED),
        blue(Color.BLUE),;
        private int color;

        ConstructorEnums(int color) {
            this.color = color;
        }

        private int getColor() {
            return color;
        }
    }

    private void test() {
        int color = ConstructorEnums.red.getColor();
    }
}

/**
 * 带抽象方法的枚举
 * 在枚举中定义抽象方法,那么这个抽象方法所有的枚举变量都要去实现;不管有多少个抽象方法都一样
 * 外界调用相对应的枚举变量中的抽象方法就可以让枚举处理自己实现的这个抽象方法的具体实现逻辑
 */
public class AbstractEnum {

    public enum AbstractEnums {
        red {
            public int getColor() {
                return Color.RED;
            }

            public String getWeek() {
                return "星期一";
            }
        },
        green {
            public int getColor() {
                return Color.GREEN;
            }

            public String getWeek() {
                return "星期一";
            }
        },
        yellow {
            public int getColor() {
                return Color.YELLOW;
            }

            public String getWeek() {
                return "星期一";
            }
        },
        blue {
            public int getColor() {
                return Color.BLUE;
            }

            public String getWeek() {
                return "星期一";
            }
        },;

        public abstract int getColor();

        public abstract String getWeek();
    }

    private void test() {
        int color = AbstractEnums.red.getColor();
    }
}

我们可以通过这四种方式根据不同的情景来使用相应的枚举处理一些复杂的逻辑。

总结:
当我们在需要控制一个方法传入的参数的时候,并且这些参数可以自己处理一些事情的时候我们就可以选择枚举来实现。

例如:时间选择格式,我们可以用枚举来规定格式,然后外界只能调用枚举中的格式,然后枚举再去将规定的格式传给时间用于格式化。
所有的逻辑处理交给枚举来完成,我们只需要调用相应的枚举类型就能得到想要的时间格式的时间。
还有很多地方都体现出枚举的好处,例如:网络请求的接口定义;一些辑返回参数的定义;

只要是需要控制变量的数量或者范围,并且拿到变量后还需要处理一些逻辑的场景都可以用枚举来完成。

空说也没作用。只有实战中真正良好的用到了,才能体会到它的魅力。

  • enum
    1 引用
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3168 引用 • 8207 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • 博客

    记录并分享人生的经历。

    270 引用 • 2386 回帖
  • DevOps

    DevOps(Development 和 Operations 的组合词)是一组过程、方法与系统的统称,用于促进开发(应用程序/软件工程)、技术运营和质量保障(QA)部门之间的沟通、协作与整合。

    40 引用 • 24 回帖
  • Typecho

    Typecho 是一款博客程序,它在 GPLv2 许可证下发行,基于 PHP 构建,可以运行在各种平台上,支持多种数据库(MySQL、PostgreSQL、SQLite)。

    12 引用 • 60 回帖 • 464 关注
  • JWT

    JWT(JSON Web Token)是一种用于双方之间传递信息的简洁的、安全的表述性声明规范。JWT 作为一个开放的标准(RFC 7519),定义了一种简洁的,自包含的方法用于通信双方之间以 JSON 的形式安全的传递信息。

    20 引用 • 15 回帖 • 21 关注
  • ZeroNet

    ZeroNet 是一个基于比特币加密技术和 BT 网络技术的去中心化的、开放开源的网络和交流系统。

    1 引用 • 21 回帖 • 592 关注
  • 星云链

    星云链是一个开源公链,业内简单的将其称为区块链上的谷歌。其实它不仅仅是区块链搜索引擎,一个公链的所有功能,它基本都有,比如你可以用它来开发部署你的去中心化的 APP,你可以在上面编写智能合约,发送交易等等。3 分钟快速接入星云链 (NAS) 测试网

    3 引用 • 16 回帖
  • SSL

    SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS 与 SSL 在传输层对网络连接进行加密。

    69 引用 • 190 回帖 • 497 关注
  • Android

    Android 是一种以 Linux 为基础的开放源码操作系统,主要使用于便携设备。2005 年由 Google 收购注资,并拉拢多家制造商组成开放手机联盟开发改良,逐渐扩展到到平板电脑及其他领域上。

    333 引用 • 323 回帖 • 67 关注
  • AngularJS

    AngularJS 诞生于 2009 年,由 Misko Hevery 等人创建,后为 Google 所收购。是一款优秀的前端 JS 框架,已经被用于 Google 的多款产品当中。AngularJS 有着诸多特性,最为核心的是:MVC、模块化、自动化双向数据绑定、语义化标签、依赖注入等。2.0 版本后已经改名为 Angular。

    12 引用 • 50 回帖 • 425 关注
  • Hprose

    Hprose 是一款先进的轻量级、跨语言、跨平台、无侵入式、高性能动态远程对象调用引擎库。它不仅简单易用,而且功能强大。你无需专门学习,只需看上几眼,就能用它轻松构建分布式应用系统。

    9 引用 • 17 回帖 • 597 关注
  • 工具

    子曰:“工欲善其事,必先利其器。”

    275 引用 • 682 回帖
  • 百度

    百度(Nasdaq:BIDU)是全球最大的中文搜索引擎、最大的中文网站。2000 年 1 月由李彦宏创立于北京中关村,致力于向人们提供“简单,可依赖”的信息获取方式。“百度”二字源于中国宋朝词人辛弃疾的《青玉案·元夕》词句“众里寻他千百度”,象征着百度对中文信息检索技术的执著追求。

    63 引用 • 785 回帖 • 251 关注
  • 黑曜石

    黑曜石是一款强大的知识库工具,支持本地 Markdown 文件编辑,支持双向链接和关系图。

    A second brain, for you, forever.

    10 引用 • 85 回帖
  • 自由行
    1 关注
  • Vim

    Vim 是类 UNIX 系统文本编辑器 Vi 的加强版本,加入了更多特性来帮助编辑源代码。Vim 的部分增强功能包括文件比较(vimdiff)、语法高亮、全面的帮助系统、本地脚本(Vimscript)和便于选择的可视化模式。

    27 引用 • 66 回帖
  • CentOS

    CentOS(Community Enterprise Operating System)是 Linux 发行版之一,它是来自于 Red Hat Enterprise Linux 依照开放源代码规定释出的源代码所编译而成。由于出自同样的源代码,因此有些要求高度稳定的服务器以 CentOS 替代商业版的 Red Hat Enterprise Linux 使用。两者的不同在于 CentOS 并不包含封闭源代码软件。

    238 引用 • 224 回帖 • 1 关注
  • 支付宝

    支付宝是全球领先的独立第三方支付平台,致力于为广大用户提供安全快速的电子支付/网上支付/安全支付/手机支付体验,及转账收款/水电煤缴费/信用卡还款/AA 收款等生活服务应用。

    29 引用 • 347 回帖
  • RYMCU

    RYMCU 致力于打造一个即严谨又活泼、专业又不失有趣,为数百万人服务的开源嵌入式知识学习交流平台。

    4 引用 • 6 回帖 • 41 关注
  • Swift

    Swift 是苹果于 2014 年 WWDC(苹果开发者大会)发布的开发语言,可与 Objective-C 共同运行于 Mac OS 和 iOS 平台,用于搭建基于苹果平台的应用程序。

    34 引用 • 37 回帖 • 499 关注
  • jsoup

    jsoup 是一款 Java 的 HTML 解析器,可直接解析某个 URL 地址、HTML 文本内容。它提供了一套非常省力的 API,可通过 DOM,CSS 以及类似于 jQuery 的操作方法来取出和操作数据。

    6 引用 • 1 回帖 • 462 关注
  • 前端

    前端技术一般分为前端设计和前端开发,前端设计可以理解为网站的视觉设计,前端开发则是网站的前台代码实现,包括 HTML、CSS 以及 JavaScript 等。

    247 引用 • 1347 回帖 • 1 关注
  • golang

    Go 语言是 Google 推出的一种全新的编程语言,可以在不损失应用程序性能的情况下降低代码的复杂性。谷歌首席软件工程师罗布派克(Rob Pike)说:我们之所以开发 Go,是因为过去 10 多年间软件开发的难度令人沮丧。Go 是谷歌 2009 发布的第二款编程语言。

    492 引用 • 1383 回帖 • 374 关注
  • 单点登录

    单点登录(Single Sign On)是目前比较流行的企业业务整合的解决方案之一。SSO 的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。

    9 引用 • 25 回帖 • 3 关注
  • WebSocket

    WebSocket 是 HTML5 中定义的一种新协议,它实现了浏览器与服务器之间的全双工通信(full-duplex)。

    48 引用 • 206 回帖 • 397 关注
  • 钉钉

    钉钉,专为中国企业打造的免费沟通协同多端平台, 阿里巴巴出品。

    15 引用 • 67 回帖 • 370 关注
  • H2

    H2 是一个开源的嵌入式数据库引擎,采用 Java 语言编写,不受平台的限制,同时 H2 提供了一个十分方便的 web 控制台用于操作和管理数据库内容。H2 还提供兼容模式,可以兼容一些主流的数据库,因此采用 H2 作为开发期的数据库非常方便。

    11 引用 • 54 回帖 • 642 关注
  • Spark

    Spark 是 UC Berkeley AMP lab 所开源的类 Hadoop MapReduce 的通用并行框架。Spark 拥有 Hadoop MapReduce 所具有的优点;但不同于 MapReduce 的是 Job 中间输出结果可以保存在内存中,从而不再需要读写 HDFS,因此 Spark 能更好地适用于数据挖掘与机器学习等需要迭代的 MapReduce 的算法。

    74 引用 • 46 回帖 • 549 关注