目录
1. 为什么要使用枚举
枚举是在 JDK
1
.
5
引⼊的,主要是⽤来表示⼀组相同业务的值,⽐如我们要实现卖⻋的程序,我们要定义⼀组颜⾊来穷举这辆⻋所提供的所有颜⾊,在没有枚举之前,我们是这样实现的:
public static int final RED = 1;
public static int final GREEN = 2;
public static int final BLACK = 3;
此时,这些代码存在3个问题:
1. 代码可读性低。比如说,当看到数字2,不能准确地知道它代表的具体是什么颜色,得去代码里面查。
2. 参数传递容易出错。以上代码类型为 int,所以在传递时理论上是可以接受所有的 int 值的,但只 有部分值是有效的颜⾊,所有很容易传递值出错。
3. 写法不够优雅。在外层(外边类)调⽤时,看到的都是⼀个个魔法数字,很让⼈很疑惑。
2. 枚举的优点
枚举:
public enum ColorEnum {
RED, GREEN, BLACK;
}
它的优点有以下⼏个:
1. 增强了代码的可读性。
(1. System.out.println("1"); 2. System.out.println(ColorEnum.RED);)
2. 减少了传递参数的错误概率。
3. switch 判断更⽅便,语法清晰。
4. 代码⾜够简洁、优雅。
3. switch判断
public enum ColorEnum {
RED, GREEN, BLACK;
public static void main(String[] args) {
ColorEnum colorEnum = ColorEnum.GREEN;
switch (colorEnum) {
case RED:
System.out.println("红⾊");
break;
case BLACK:
System.out.println("⿊⾊");
break;
case GREEN:
System.out.println("绿⾊");
break;
default:
System.out.println("其他颜⾊");
break;
}
}
}
4. 枚举的常用方法
4.1 values()使用
以数组形式返回枚举类型的所有成员
enum ColorEnum {
RED, GREEN, BLACK;
public static void main(String[] args) {
for (ColorEnum colorEnum : ColorEnum.values()) {
System.out.println(colorEnum);
}
}
}
// 输出: RED GREEn BLACK
4.2 ordinal() 使⽤
获取枚举成员的索引位置
enum ColorEnum {
RED, GREEN, BLACK;
public static void main(String[] args) {
for (ColorEnum colorEnum : ColorEnum.values()) {
int enumIdx = colorEnum.ordinal();
System.out.println(colorEnum + ":" + colorEnum.ordinal());
}
}
}
//输出: RED : 0 GREEN : 1 BLACK : 2
4.3 valueOf() 使⽤
将普通字符串转换为枚举类型
enum ColorEnum {
RED, GREEN, BLACK;
public static void main(String[] args) {
String color = "RED";
//因为枚举类型传入的可以是所有,因此使用try。。。catch。。。抛出异常
//将字符串转换成枚举类型
try{
ColourEnum colourEnum = ColourEnum.valueOf(color);
System.out.println(colorEnum.ordinal());
} catch(Exception e) {
System.out.println("枚举转换异常");
}
}
}
//输出: 0
4.4 compareTo() 使⽤
比较两个枚举成员在定义时的顺序。 ⽐较两个枚举成员在定义时的顺序,返回值为 -1/0/1。
enum ColorEnum {
RED, GREEN, BLACK;
public static void main(String[] args) {
System.out.println(ColorEnum.RED.compareTo(ColorEnum.GREEN));
}
}
// 输出: -1
// RED下标为0,GREEN下标为1,BLACK下标为2
// 用RED的下标减去GREEN的下标
// A 在 B前⾯(A.compareTo(B))返回的是 -1,等于是0,A 在 B后⾯就是 1。
5. 枚举的缺点
不可继承,⽆法扩展。