Fellow Travellers

Java 8 之enum枚举

万世威
字数统计: 751阅读时长: 3 min
2018/10/22 Share

Enum 枚举

1
2
3
public enum Color {
RED, YELLOW, BLUE;
}

==说明:==

使用的是enum关键字而不是class

多个枚举变量之间用 逗号 隔开

枚举变量名大写,多个单词之间用 _ 隔开。 如。 ALL_NUM…

定义完枚举变量后, 用分号 结束。如果只有枚举变量,而没有自定义变量,分号可以省略。

使用 只需要【类名.变量名】就可以了,和使用静态变量一样。

方法:

values()

这个方法会返回包括所有枚举变量的数组

1
2
3
4
5
6
7
8
9
10
for (Color color : Color.values()) {
// 下标
System.out.println(color.ordinal());
// 枚举变量名字
System.out.println(color.name());
// 同上
System.out.println(color.toString());
}
// 比较的是下标
System.out.println(Color.valueOf("YELLOW").compareTo(Color.valueOf("BLUE")));

valueOf(String name)

它的作用是传来一个字符串,然后将它转变为对应的枚举变量 .

字符串和定义枚举变量的字符串必须一样,并且区分大小写。如果不存在会抛出异常。java.lang.IllegalArgumentException

1
2
3
4
5
6
7
8
9
public enum Weekday {
MON(1),TUS(2),WED(3),THU(4),FRI(5),SAT(6),SUN(0);

private int index;

private Weekday(int index){
this.index = index;
}
}

==说明==

定义的枚举变量 必须 在第一行。以 分号结束。

构造函数只能是 private 的。否则 编译不通过

自定义的 index 和 下标 不冲突。

枚举类中的抽象类

实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public enum Color {
RED() {
@Override
public Color getNextColor() {
return YELLOW;
}
},
YELLOW(){
@Override
public Color getNextColor() {
return BLUE;
}
},
BLUE(){
@Override
public Color getNextColor() {
return RED;
}
};

/**
* 获取下一种颜色
* @return
*/
public abstract Color getNextColor();
}
1
2
3
4
Color yellow = Color.valueOf("YELLOW");
System.out.println(yellow.getNextColor());

// BLUE

枚举类的原理:

1
2
3
4
5
6
7
8
9
public enum Weekday {
MON(1),TUS(2),WED(3),THU(4),FRI(5),SAT(6),SUN(0);

private int index;

private Weekday(int index){
this.index = index;
}
}

javap 反编译 Weekday.class

1
2
3
4
5
6
7
8
9
10
11
12
public final class enums.Weekday extends java.lang.Enum<enums.Weekday> {
public static final enums.Weekday MON;
public static final enums.Weekday TUS;
public static final enums.Weekday WED;
public static final enums.Weekday THU;
public static final enums.Weekday FRI;
public static final enums.Weekday SAT;
public static final enums.Weekday SUN;
public static enums.Weekday[] values();
public static enums.Weekday valueOf(java.lang.String);
static {};
}

是 final 类,不能被继承。

继承了 java.lang.Enum 类。只能实现接口了。

在Color枚举类中定义的 RED、、、本身是一个 Color对象的引用。Color RED = new Color(); 使用匿名内部类方式:

1
2
3
4
5
6
7
Color RED = new Color() {
@override
public Color getNextColor() {
return YELLOW;
}
}
在枚举类中 只用写 RED(){...} JVM会完成其它操作

枚举类在switch中应用

1
2
3
4
5
6
7
8
9
10
11
switch (color) {
case RED:
color = Color.GREEN;
break;
case YELLOW:
color = Color.RED;
break;
case GREEN:
color = Color.YELLOW;
break;
}

枚举类实现接口

1
2
3
4
public interface Behaviour {
void print();
String getInfo();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public enum Weekday implements Behaviour{
MON(1),TUS(2),WED(3),THU(4),FRI(5),SAT(6),SUN(0);

private int index;

Weekday(int index){
this.index = index;
}

@Override
public void print() {
System.out.println(this.index + ":" + toString());
}

@Override
public String getInfo() {
return toString();
}
}

枚举实现 单例模式

1
2
3
4
5
6
7
8
9
10
public enum DataSourceEnum {
DATASOURCE;
private DBConnection connection = null;
private DataSourceEnum() {
connection = new DBConnection();
}
public DBConnection getConnection() {
return connection;
}
}

扩展:
https://blog.csdn.net/gavin_dyson/article/details/69668946

CATALOG
  1. 1. Enum 枚举
    1. 1.1. 枚举类中的抽象类
    2. 1.2. 枚举类在switch中应用
    3. 1.3. 枚举类实现接口
    4. 1.4. 枚举实现 单例模式