当前位置: 首页 > news >正文

Java枚举(Enum)

枚举(enum)

enum全称enumeration,JDK 1.5中引入的新特性。在Java中,被enum关键字修饰的类型就是枚举类型
可以将枚举看成一个类,它继承于java.lang.enum类,当定义一个枚举类型时,每一个枚举类型成员都可以看作是枚举类型的一个实例,枚举类型成员默认被public static final修饰(所有的枚举值都是类静态常量),所以当使用枚举类型成员时直接使用枚举类型名称调用枚举类型成员即可。

enum Color { RED, GREEN, BLUE }

如果枚举不添加任何方法,枚举值默认为从0开始的有序数值。以Color枚举类型举例,它的枚举常量依次为RED:0,GREEN:1,BLUE:2。

枚举的好处:可以将常量组织起来,统一进行管理
枚举的典型应用场景:错误码、状态机等
特性:除了不能继承,基本上可以将enum看做一个常规的类


作用?

枚举是一种规范,它规范了参数的形式,这样就可以不用考虑类型的不匹配并且显式的替代了int型参数可能带来的模糊概念。枚举像一个类,又像一个数组。


优势

(1)类型安全
(2)紧凑有效的数据定义
(3)可以和程序其他部分完美交互
(4)运行效率高


本质

尽管enum看起来像是一种新的数据类型,事实上,enum是一种受限制的类,并且具有自己的方法。创建enum时,编译器会生成一个相关的类,这个类继承自java.lang.Enum


构造方法

在枚举类型中,可以添加构造方法,但是规定这个构造方法必须为private修饰符或者默认修饰符所修饰

public enum Color {RED(1, "红色"), GREEN(2, "绿色"), RED_ONE(1);private int index;private String value;private Color() {// 无参构造}private Color(int index) {this.index = index;}private Color(int index, String value) {// 有参构造this.index = index;this.value = value;}
}

保存枚举值,应该是要保存int值,如果保存字符串,在使用中英文切换可能就会出问题
枚举类型可以实现一个或多个接口,但是不能继承类。因为编译器会默认将枚举类型继承自java.lang.Enum类,这一过程由编译器完成
枚举类型中的常量成员必须在其他成员之前定义,否则这个枚举类型不会产生对象


方法

方法描述
values()返回enum实例的数组。数组中的元素严格保持在enum中声明时的顺序
name()返回实例名
ordinal()返回实例声明时的次序,从0开始
getDeclaringClass()返回实例所属的enum类型
equals()判断是否为同一个对象
可以使用==来比较enum实例。此外,java.lang.Enum实现了Comparable和 Serializable 接口,所以也提供 compareTo()方法

为枚举显示的赋值
Java不允许使用 = 为枚举常量赋值
enum可以添加普通方法、静态方法、抽象方法、构造方法

Java虽然不能直接为实例赋值,但是它有更优秀的解决方案:为enum添加方法来间接实现显示赋值。创建enum时,可以为其添加多种方法,甚至可以为其添加构造方法

注意:如果要为enum定义方法,那么必须在enum的最后一个实例尾部添加一个分号。此外,在enum中,必须先定义实例,不能将字段或方法定义在实例前面。否则,编译器会报错


常见用法

1.常量

枚举可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法

public enum Color { RED, GREEN, BLANK, YELLOW 
}

2.Switch

JDK1.6之前的switch语句只支持int,char,enum类型,使用枚举,能让代码可读性更强

enum Color {  GREEN, YELLOW, RED
}  class TrafficLight {  Color color = Color.RED;  public void change() {  switch (color) {  case RED:  color = Color.GREEN;  break;  case YELLOW:  color = Color.RED;  break;  case GREEN:  color = Color.YELLOW;  break;  }  }  }

3.向枚举中添加新方法

public enum Color {RED(1, "红色"), GREEN(2, "绿色"), BLANK(3, "白色"), YELLO(4, "黄色");// 成员变量private int index;private String name;private Color(int index, String name) {// 构造方法this.name = name;this.index = index;}// 普通方法public static String getName(int index) {  //定义了才能使用RED(1, "红色")for (Color c : Color.values()) {if (c.getIndex() == index) {return c.name;}}return null;}// getter、setterpublic String getName() {return name;}public void setName(String name) {this.name = name;}public int getIndex() {return index;}public void setIndex(int index) {this.index = index;}
}

4.覆盖枚举的方法

toString()方法覆盖

public enum Color {RED(1, "红色"), GREEN(2, "绿色"), BLANK(3, "白色"), YELLO(4, "黄色");// 成员变量private int index;private String name;private Color(int index, String name) {// 构造方法this.name = name;this.index = index;}@Overridepublic String toString() {// 覆盖toString方法return this.index + "_" + this.name;}
}

5.实现接口

所有的枚举都继承自java.lang.Enum类。由于Java不支持多继承,所以枚举对象不能再继承其他类

interface Behaviour {void print();String getInfo();
}public enum Color implements Behaviour {RED(1, "红色"), GREEN(2, "绿色"), BLANK(3, "白色"), YELLO(4, "黄色");// 成员变量private int index;private String name;private Color(int index, String name) {// 构造方法this.name = name;this.index = index;}@Overridepublic String getInfo() {//接口方法 return this.name;}@Overridepublic void print() {// 接口方法System.out.println(this.index + ":" + this.name);}
}

6.使用接口组织枚举

public interface Food {  enum Coffee implements Food{  BLACK_COFFEE,DECAF_COFFEE,LATTE,CAPPUCCINO  }  enum Dessert implements Food{  FRUIT, CAKE, GELATO  }  
}

7.枚举集合

java.util.EnumSet和java.util.EnumMap是两个枚举集合
EnumSet保证集合中的元素不重复;EnumMap中的 key是enum类型,而value则可以是任意类型


枚举遍历

for (RnumTest e : RnumTest.values()) {System.out.println(e.toString());
}




上一篇:Java IO数据流                        下一篇:Java泛型




http://www.lryc.cn/news/61126.html

相关文章:

  • 【Python】【进阶篇】二十一、Python爬虫的多线程爬虫
  • Python从入门到精通14天(eval、literal_eval、exec函数的使用)
  • 队列的基本操作(C语言链表实现)初始化,入队,出队,销毁,读取数据
  • 项目支付接入支付宝【沙箱环境】
  • 程序员应该如何提升自己
  • 全球上线!ABB中国涡轮增压器分拆 – 数据清理阶段完成
  • 手写简易 Spring(三)
  • 设计模式-看懂UML类图和时序图
  • 2023年全国最新安全员精选真题及答案57
  • 数字图像处理基础
  • onnx手动操作
  • 虚拟机安装Centos7,ping不通百度
  • leetCode算法第一天
  • 怎么将太大的word文档压缩变小,3个高效方法
  • mvc+动态代理
  • vue-cli(vue脚手架方式搭建)
  • CentOS 安装 Docker
  • 别搞了 软件测试真卷不动了...
  • OJ刷题 第十二篇
  • 【计算机专业应届生先找培训还是先找个工作过渡一下?】
  • MySQL数据库,联合查询
  • springboot注解(全)
  • 进制转换—包含整数和小数部分转换(二进制、八进制、十进制、十六进制)手写版,超详细
  • 什么是UML?
  • 5.3 Mybatis映射文件 - 零基础入门,轻松学会查询的select标签和resultMap标签
  • “华为杯”研究生数学建模竞赛2020年-【华为杯】B题:汽油辛烷值优化建模(附获奖论文和python代码实现)
  • C6678开发概述与Sys/bios基本使用
  • python算法中的图算法之网络流算法(详解二)
  • 企业电子招投标采购系统之项目说明和开发类型源码
  • ERTEC200P-2 PROFINET设备完全开发手册(8-1)