前言

枚举是很多面向对象语言都会有的一种类型,它可以将表达同一类型的变量组合成一个集合,组成一个常量集

在Java中也有枚举类型,是用enum关键字来表示的

枚举常用来表示一个常量集,用来限定变量的取值,只能在枚举的范围内,比如一年四季只有春、夏、秋、冬、一个星期只有周一到周日,这类固定的常量就比较适合用枚举来表达

当然你说我用静态的常量来表达行不行呢?也是可以的,只是枚举就是为这种场景而生的

枚举这种类型其实没什么存在感,大家在使用的时候也是使用最基本的用法,甚至很多人都不用枚举,至少我自己在写这篇文章之前是很少用
枚举类型的,经常会用静态常量来代替枚举,但枚举确实有他的好处,下面我们就一起来看一下

枚举的简单用法

public enum OrderState {ORDER_CONFIRM,ORDER_PAYED,ORDER_DELIVERY,ORDER_FINISH
}

OrderState列举了订单的几种状态

  • ORDER_CONFIRM 订单已确认
  • ORDER_PAYED 订单已支付
  • ORDER_DELIVERY 订单已出库
  • ORDER_FINISH 订单已完成
OrderState orderState = OrderState.ORDER_FINISH;
System.out.println(orderState);

在使用枚举类型时,需要定义一个枚举类型的对象,如上代码,执行结果如下:

ORDER_FINISH

枚举类型常用的方法

  • values() 返回所有的枚举值数组
  • ordinal() 表示枚举值在枚举类型中的次序,从0开始
  • compareTo() 用于比较两个枚举类型
  • name() 返回枚举值
// values()返回所有的枚举值
for (OrderState os :OrderState.values()) {//枚举值的次序System.out.println(os + "|" + os.ordinal());//比较System.out.println(os.compareTo(OrderState.ORDER_FINISH));//枚举值System.out.println(os.name());System.out.println("------------------");
}

向枚举中添加方法

在枚举的简单用法中,枚举类里面只定义了几个常量,其实枚举类型中还可以增加方法

public enum OrderState {ORDER_CONFIRM(0,"订单已确认"),ORDER_PAYED(1,"订单已支付"),ORDER_DELIVERY(2,"订单已支付"),ORDER_FINISH(3,"订单已完成");private int state;private String stateText;OrderState(int state,String stateText){this.state = state;this.stateText = stateText;}public int getState(){return state;}public String getStateText(){return stateText;}public static void main(String[] args){for(OrderState orderState : OrderState.values()){System.out.println(orderState + "|" + orderState.getState() + "|" + orderState.getStateText());}}
}

从上面的代码可以看出来,枚举类型可以有构造方法,也可以有普通方法,枚举跟类很像,或者说它就是一种拥有限制的类

switch中的枚举

枚举跟switch语句简直是天造地设的一对,switch中可以天然的支持枚举类型

switch (orderState){case ORDER_CONFIRM:System.out.println(orderState.getState());break;case ORDER_PAYED:System.out.println(orderState.getStateText());break;case ORDER_DELIVERY:System.out.println(orderState.getState());break;case ORDER_FINISH:System.out.println(orderState.getStateText());break;
}

枚举的真面目

我们用编译/反编译的方法来看一下枚举到底是个什么鬼类型

首先编译OrderState.java文件,注意你的枚举类型中有中文需要加-encoding参数用UTF-8进行编码,否则会编译不通过

javac -encoding UTF-8 OrderState.java

执行完成后,在同一目录下会生成一个OrderState.class文件,我们反编译回来

javap -p OrderState.class

会得到如下的代码

//枚举就是一个继承自Enum的类
public final class org.kxg.enumDemo.OrderState extends java.lang.Enum<org.kxg.enumDemo.OrderState> {//枚举中的常量就是类的静态变量public static final org.kxg.enumDemo.OrderState ORDER_CONFIRM;public static final org.kxg.enumDemo.OrderState ORDER_PAYED;public static final org.kxg.enumDemo.OrderState ORDER_DELIVERY;public static final org.kxg.enumDemo.OrderState ORDER_FINISH;//私有变量变成类的私有变量private int state;private java.lang.String stateText;private static final org.kxg.enumDemo.OrderState[] $VALUES;//values()很有意思,它是编译器自动生成的public static org.kxg.enumDemo.OrderState[] values();public static org.kxg.enumDemo.OrderState valueOf(java.lang.String);//构造方法private org.kxg.enumDemo.OrderState(int, java.lang.String);public int getState();public java.lang.String getStateText();public static void main(java.lang.String[]);static {};
}

从反编译回来的内容,可以看出来,枚举类型本质是就是继承自Enum的final类,枚举中定义的常量就是类的静态常量

有一个很有意思的点就是,编译器会自动生成values()方法,因为在枚举本身和Enum类中都没有values()方法,只能是编译器在编译的时候自动生成的

枚举可以继承,可以实现接口吗?

枚举可以继承吗?可以实现接口吗?

面试官就喜欢问类似的问题,如果你对枚举不了解,肯定就答不上来了

从上面反编译的结果来看,枚举本质是个final类并且继承自Enum,Java里面不支持多继承,所以枚举不能继承其他类,同时枚举是个final类,也不能被继承

但枚举可以实现接口,枚举本质上就是个类,所以它有类的一般特性

定义一个接口

public interface Color {public String getColor();
}

定义一个枚举类型,实现Color接口

public enum EmnuInterface implements Color {RED("红色"),GREEN("绿色"),GRAY("灰色"),YELLOW("黄色");private String color;EmnuInterface(String color){this.color = color;}@Overridepublic String getColor() {return color;}public static void main(String[] args){EmnuInterface color = EmnuInterface.GREEN;System.out.println(color.getColor());}
}

输入结果:

绿色

枚举的优缺点

1、枚举常量简单安全

不使用枚举的时候,我们是这样定义常量的

public static final String RED = "红色";
public static final String GREEN = "绿色";
public static final String GRAY = "灰色";
public static final String YELLOW = "黄色";

这样使用看起来也没什么问题,可以达到常量的效果,但这个静态常量是不具有范围限定的,比如我有一个方法要限定只能传入指定的几个颜色,使用静态常量就无法限制范围,使用者可以随意传入静态常量,但如果使用了枚举就可以限定只能传入指定范围内的值

2、枚举有内置方法

如果要列出所有的常量,类和接口必须使用反射,比较繁琐,而枚举有内置的方法values()可以很方便的列举出静态常量

3、枚举的缺点

枚举不可继承,无法扩展,但枚举一般用来定义常量,也不需要扩展

如果感觉对你有些帮忙,请收藏好,你的关注和点赞是对我最大的鼓励!
如果想跟我一起学习,坚信技术改变世界,请关注【Java天堂】公众号,我会定期分享自己的学习成果,第一时间推送给您

枚举到底是个什么鬼类型?相关推荐

  1. 章磊回答: 姚期智提出的百万富翁难题被破解? 多方安全计算MPC到底是个什么鬼?

    姚期智提出的"百万富翁"难题被破解? 多方安全计算MPC到底是个什么鬼? 作者 | 章磊 责编 | Aholiab 出品 | CSDN.ARPA 在越来越多对数据隐私的担忧声中,政 ...

  2. 【干货】CRM大牛告诉你,Salesforce到底是个什么鬼?

    本期主题 | Salesforce到底是个什么鬼 分享嘉宾 | 裘思博 Celnet雨花石创始人&合伙人 文字整理 | 莜筱 入群请联系管理员 37℃ 微信号:erhuoyimei 裘思博 本 ...

  3. python logger handler_Python中的logger和handler到底是个什么鬼

    最近的任务经常涉及到日志的记录,特意去又学了一遍logging的记录方法.跟java一样,python的日志记录也是比较繁琐的一件事,在写一条记录之前,要写好多东西.典型的日志记录的步骤是这样的: 创 ...

  4. 广义线性模型到底是个什么鬼?

    以下文章内容摘自网络:说人话的统计学 原标题:广义线性模型到底是个什么鬼? ❉说人话的统计学❉ 从逻辑回归模型开始,我们连续讲了好多集有些相似又特点各异的几种统计模型.它们有个统一的旗号,叫做「广义线 ...

  5. 云”到底是什么? 云计算类型细分

    本文讲的是云"到底是什么? 云计算类型细分,[IT168 资讯]云计算时下可谓风靡一时,正如Gartner咨询公司资深分析师Ben Pring所说:"云计算已经成为大家津津乐道的话 ...

  6. 区块链到底是个什么鬼,一幅漫画让你秒懂

    区块链到底是个什么鬼,一幅漫画让你秒懂 字体:  小  中  大  | 打印发布: 2018-1-12 10:58    作者: n    来源: 21世纪经济报道    查看: 930 次 区块链技 ...

  7. 计算机硬件的漏洞,震惊了硬件圈子的CPU漏洞,到底是个什么鬼?

    原标题:震惊了硬件圈子的CPU漏洞,到底是个什么鬼? 这两天如果你关注一点硬件圈的话,可能会注意到这两天CPU爆出了两个重要漏洞(一开始大家以为只有一个).关于这俩漏洞,身边也有人问过橙子君这究竟是个 ...

  8. Vuex白话教程第一讲:Vuex到底是个什么鬼?

    Vuex白话教程第一讲:Vuex到底是个什么鬼? Vuex白话教程第二讲:Vuex旗下的State和Getter Vuex白话教程第三讲:Vuex旗下的Mutation Vuex白话教程第四讲:Vue ...

  9. 敏捷到底是个什么鬼?

    " 如何用一两句话说清楚敏捷的本质是什么呢?" 温馨提示,如果眼睛太累或者在忙其他事,按照这个攻略可以听本文: 看文章很累,不如听吧!手把手教你如何听公众号文章 大家都知道,敏捷虽 ...

最新文章

  1. mysql常见报错解决办法
  2. 【JZOJ4861】【NOIP2016提高A组集训第7场11.4】推冰块
  3. 使用junit+mockito进行mock测试实例
  4. String s1=new String(“abc“); 和String s1=“abc“区别
  5. qt5 交叉编译webkit_Qtwebkit配置,设置交叉编译环境 - croop520的专栏 - 博客频道 - CSDN.NET...
  6. 北深互联网之争:北京约饭,深圳建群
  7. The Number of Products
  8. prim算法_数据结构 7.4.1 最小生成树 Prim
  9. 日常开支记账,自动统计用它就够了
  10. 制作颜色选择器(全)
  11. 关于js的match用法
  12. vue中自己实现的页面切换标签手动关闭功能
  13. speedoffice表格如何方框内打勾
  14. AXI中的wrap burst
  15. 粉丝福利,抽5本《新程序员》004期免费送
  16. 十行js代码实现windows上录屏功能
  17. 20145212 罗天晨 MSF基础应用
  18. 高斯计校准与计量的区别
  19. mysql管理员权限哪个表_Mysql 用户权限管理(权限列表)
  20. Android入门:Layout

热门文章

  1. 想自己做一个小米的线控耳机
  2. 手机产品交互设计样式
  3. 单字节修改实现PC版微信多开
  4. 轻松打造免开发智能电水壶
  5. Docker 官网教程实践 自定义 bridge 网络
  6. Android遇上手写板
  7. 超级工具类 AndroidUtilCode
  8. h5图片自适应div css设置
  9. 罗永浩做的事,到底哪里令你反感!
  10. 【Http Referer】