一 枚举类型简介
在JDK1.5之前,Java是没有枚举类型的,只有:类和接口。当然,在一般情况下这两种类型就已经足够了,不过在某些特殊情况下就显得有点不合适了。比如:“春夏秋冬”组成的四季这个“数据集”就不能有其他元素;定义一个Color类,它只能有Red,Green,Blue这3个值。像这样只有几个固定的元素组成的“数据集”,其他的任何值都是非法的,这时我们就可以使用枚举类型。
enum 的全称为 enumeration, 是 JDK 1.5 中引入的新特性,存放在 java.lang 包中。如果想要在JDK1.5之前实现类似枚举的功能,就必须依靠类似以下这种代码来完成。
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
27
28
29
30
31
32
33
|
package
javase.enumdemo;
public
class
Color {
/**
* 定义三个实例化对象,同时构造方法私有化,外部想要取得Color类的实例
* 就只能通过RED,GREEN和BLUE这三个对象
* */
public
static
final
Color RED =
new
Color(
"红色"
);
public
static
final
Color GREEN =
new
Color(
"绿色"
);
public
static
final
Color BLUE =
new
Color(
"蓝色"
);
private
String name;
/**
* 构造方法私有化
* */
private
Color(String name) {
this
.name = name;
}
public
String getName() {
return
name;
}
public
void
setName(String name) {
this
.name = name;
}
public
static
void
main(String[] args) {
Color color_1 = Color.RED;
System.out.println(color_1.getName());
}
}
|
输出:
1
|
|
以上的代码还是有不少问题的,最明显的一点是:如果用户想要知道到底有多少种颜色可以使用,其实现的代码就不是那么简单,更别说加入到集合进行操作了。因此,枚举就是为了解决这些问题而产生的。
二 枚举类型的定义和常用方法
(1)定义:
[public] enum 枚举类型名称{
枚举对象1,枚举对象2,…,枚举对象n;
}
实例:
1
2
3
4
5
6
7
8
|
package
javase.enumdemo;
public
enum
Color_2 {
/**
* 定义了3个枚举类型
* */
RED,GREEN,BLUE;
}
|
(2)常用方法示例:
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
|
package
javase.enumdemo;
public
class
Color_2Demo {
/**
* 取出枚举内容
* */
public
void
getEnumContent() {
Color_2 color = Color_2.RED;
System.out.println(color);
}
/**
* 遍历所有枚举内容
* */
public
void
forEachEnum() {
for
(Color_2 color : Color_2.values())
System.out.println(color);
}
/**
* switch判断
* */
public
void
switchPrintEnum() {
for
(Color_2 color : Color_2.values()) {
switch
(color) {
case
RED:
System.out.println(
"红色"
);
break
;
case
GREEN:
System.out.println(
"绿色"
);
break
;
case
BLUE:
System.out.println(
"蓝色"
);
break
;
default
:
System.out.println(
"未知颜色"
);
break
;
}
}
}
/**
* 测试枚举的ordinal()和name()方法
* */
public
void
ordinalTest(){
for
(Color_2 color : Color_2.values()){
//color.ordinal() 返回枚举常量的序数
//color.name() 返回枚举常量的名称
System.out.println(color.ordinal() +
" --> "
+ color.name());
}
}
public
static
void
main(String[] args) {
Color_2Demo color_2Demo =
new
Color_2Demo();
color_2Demo.getEnumContent();
System.out.println(
"******************http://www.zifangsky.cn**********************"
);
color_2Demo.forEachEnum();
System.out.println(
"******************http://www.zifangsky.cn**********************"
);
color_2Demo.switchPrintEnum();
System.out.println(
"******************http://www.zifangsky.cn**********************"
);
color_2Demo.ordinalTest();
}
}
|
输出:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
RED
******************http:
//www.zifangsky.cn**********************
RED
GREEN
BLUE
******************http:
//www.zifangsky.cn**********************
红色
绿色
蓝色
******************http:
//www.zifangsky.cn**********************
0
--> RED
1
--> GREEN
2
--> BLUE
|
三 为每一个枚举对象属性赋值
(1)通过构造方法为属性赋值
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
package
javase.enumdemo;
public
enum
Color_3 {
RED(
"红色"
),GREEN(
"绿色"
),BLUE(
"蓝色"
);
private
String name;
/**
* 为枚举对象属性赋值
* 第一种方式,通过构造方法
* */
private
Color_3(String name) {
this
.name = name;
}
public
String getName() {
return
name;
}
public
void
setName(String name) {
this
.name = name;
}
}
|
测试:
1
2
3
4
5
6
7
8
9
10
11
|
package
javase.enumdemo;
public
class
Color_3Demo {
public
static
void
main(String[] args) {
for
(Color_3 color : Color_3.values())
System.out.println(color.ordinal() +
" --> "
+ color.name() +
"("
+ color.getName() +
")"
);
}
}
|
输出:
1
2
3
|
0
--> RED(红色)
1
--> GREEN(绿色)
2
--> BLUE(蓝色)
|
(2)通过setter方法为属性赋值
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
package
javase.enumdemo;
public
enum
Color_4 {
RED,GREEN,BLUE;
private
String name;
public
String getName() {
return
name;
}
/**
* 为枚举对象属性赋值
* 第二种方式,通过setter方法
* */
public
void
setName(String name) {
switch
(
this
) {
case
RED:
if
(
"红色"
.equals(name))
this
.name = name;
else
System.out.println(
"设置属性名称不恰当"
);
break
;
case
GREEN:
if
(
"绿色"
.equals(name))
this
.name = name;
else
System.out.println(
"设置属性名称不恰当"
);
break
;
case
BLUE:
if
(
"蓝色"
.equals(name))
this
.name = name;
else
System.out.println(
"设置属性名称不恰当"
);
break
;
default
:
break
;
}
}
}
|
测试:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
package
javase.enumdemo;
public
class
Color_4Demo {
public
static
void
main(String[] args) {
Color_4 color = Color_4.BLUE;
color.setName(
"红色"
);
System.out.println(color.getName());
//设置不恰当,输出为:null
color.setName(
"蓝色"
);
System.out.println(color.getName());
}
}
|
输出:
1
2
3
|
设置属性名称不恰当
null
蓝色
|
四 类集对枚举的支持——EnumMap和EnumSet
(1)EnumMap的简单使用
i)构造方法如下:
public EnumMap(Class<K> keyType)
ii)简单示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
package
javase.enumdemo;
import
java.util.EnumMap;
import
java.util.Map;
enum
Color_5 {
RED, GREEN, BLUE;
}
public
class
EnumMapDemo {
public
static
void
main(String[] args) {
Map<Color_5, String> map =
new
EnumMap<Color_5, String>(Color_5.
class
);
map.put(Color_5.RED,
"红色"
);
map.put(Color_5.BLUE,
"蓝色"
);
//遍历
for
(Map.Entry<Color_5, String> mapEntry : map.entrySet())
System.out.println(mapEntry.getKey().name() +
" --> "
+ mapEntry.getValue());
}
}
|
输出:
1
2
|
RED --> 红色
BLUE --> 蓝色
|
(2)EnumSet的几种常用方法示例:
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
|
package
javase.enumdemo;
import
java.util.EnumSet;
public
class
EnumSetDemo {
/**
* 将全部枚举类型添加到EnumSet集合中
* */
public
void
allOfTest(){
EnumSet<Color_5> set = EnumSet.allOf(Color_5.
class
);
for
(Color_5 color : set)
System.out.print(color +
"\t"
);
System.out.println();
}
/**
* 只设置一个枚举类型到集合中
* */
public
void
ofTest(){
EnumSet<Color_5> set = EnumSet.of(Color_5.BLUE);
for
(Color_5 color : set)
System.out.println(color);
}
/**
* 创建一个只能添加指定内容的空集合
* */
public
void
noneOfTest(){
EnumSet<Color_5> set = EnumSet.noneOf(Color_5.
class
);
set.add(Color_5.RED);
set.add(Color_5.GREEN);
for
(Color_5 color : set)
System.out.print(color +
"\t"
);
System.out.println();
}
/**
* 创建不包含指定元素的集合
* */
public
void
complementOfTest(){
EnumSet<Color_5> oldSet = EnumSet.of(Color_5.BLUE,Color_5.GREEN);
EnumSet<Color_5> newSet = EnumSet.complementOf(oldSet);
for
(Color_5 color : newSet)
System.out.print(color +
"\t"
);
System.out.println();
}
/**
* 复制已有集合中的内容
* */
public
void
copyOfTest(){
EnumSet<Color_5> oldSet = EnumSet.of(Color_5.RED,Color_5.GREEN);
EnumSet<Color_5> newSet = EnumSet.copyOf(oldSet);
for
(Color_5 color : newSet)
System.out.print(color +
"\t"
);
System.out.println();
}
public
static
void
main(String[] args) {
EnumSetDemo enumSetDemo =
new
EnumSetDemo();
enumSetDemo.allOfTest();
System.out.println(
"******************http://www.zifangsky.cn**********************"
);
enumSetDemo.ofTest();
System.out.println(
"******************http://www.zifangsky.cn**********************"
);
enumSetDemo.noneOfTest();
System.out.println(
"******************http://www.zifangsky.cn**********************"
);
enumSetDemo.complementOfTest();
System.out.println(
"******************http://www.zifangsky.cn**********************"
);
enumSetDemo.copyOfTest();
}
}
|
输出:
1
2
3
4
5
6
7
8
9
|
RED GREEN BLUE
******************http:
//www.zifangsky.cn**********************
BLUE
******************http:
//www.zifangsky.cn**********************
RED GREEN
******************http:
//www.zifangsky.cn**********************
RED
******************http:
//www.zifangsky.cn**********************
RED GREEN
|
五 让枚举类实现一个接口
枚举类实现一个接口,因为接口中含有抽象方法,因此枚举类中的每个对象都需要分别实现接口中的抽象方法,示例代码如下:
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
27
28
29
30
31
32
33
|
package
javase.enumdemo;
interface
Print{
public
String getColor();
}
/**
* 枚举类实现了一个接口Print
* 因此枚举类中的每个对象都必须分别实现接口中的抽象方法
* */
enum
Page
implements
Print{
WHITEPAGE{
public
String getColor() {
return
"白色"
;
}
},BLUEPAGE{
public
String getColor() {
return
"蓝色"
;
}
},GRAYPAGE{
public
String getColor() {
return
"灰色"
;
}
};
}
public
class
InterfaceEnumDemo {
public
static
void
main(String[] args) {
Page page = Page.GRAYPAGE;
System.out.println(page.getColor());
}
}
|
输出:
1
|
|
六 在枚举类中定义抽象方法
跟前面枚举类实现一个接口类似,也需要枚举类中的每个对象分别实现其抽象方法,示例代码如下:
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
27
28
29
30
|
package
javase.enumdemo;
/**
* 枚举中定义抽象方法
* 同样,枚举类中的每个对象都必须分别实现该抽象方法
* */
enum
Person{
STUDENT{
public
String getJobName() {
return
"学生"
;
}
},TEACHER{
public
String getJobName() {
return
"教师"
;
}
},PROGRAMMER{
public
String getJobName() {
return
"程序猿"
;
}
};
public
abstract
String getJobName();
//抽象方法
}
public
class
AbstractMethodDemo {
public
static
void
main(String[] args) {
Person person = Person.PROGRAMMER;
System.out.println(person.getJobName());
}
}
|
输出:
1
|
程序猿
|