17.Java枚举(Enum)
目录
1. Java基本介绍
2. JDK下载安装及其环境配置
3. 一个简单的java程序
4. Eclipse基本使用、数据类型、运算符
5. 控制语句(if、switch、for、while、foreach)
6. Java数组
7. Java字符串对象(String|StringBuffer|StringBuilder|StringJoiner)
8. Java面向对象
9. 正则表达式
10. Java包装类
11. 日期与时间
12. 异常(throwable)
13. Java日志处理
14. Java集合框架(Collection)
15. Java多线程
16. Java IO数据流
17. Java枚举(Enum)
18. Java泛型
19. Java Class类和Java反射
20. JDBC操作数据库
21. Java网络通信
22. Java注解
23. Java 1.8新特性
24. Java函数式编程
枚举(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、setter
public 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;
}
@Override
public 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;
}
@Override
public String getInfo() {//接口方法
return this.name;
}
@Override
public 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());
}