Java枚举类

Java枚举类

枚举类的使用

枚举类的使用:

  • 枚举类的理解:类的对象只有有限个,确定的。我们称此类为枚举类。
  • 当需要定义一组常量时,强烈建议使用枚举类。
  • 如果枚举类只有一个对象, 则可以作为一种单例模式的实现方式。

枚举类的定义

如何定义枚举类:

  • 方式一:jdk5.0之前,自定义枚举类。
    • 枚举类对象的属性不应允许被改动,所以应该使用 private final 修饰
    • 枚举类的使用 private final 修饰的属性应该在构造器中为其赋值
    • 若枚举类显式的定义了带参数的构造器,则在列出枚举值时也必须对应的传入参数
  • 方式二:jdk5.0,使用enum关键字定义枚举类。
    • 必须在枚举类的第一行声明枚举类对象
    • 默认继承java.lang.Enum父类

自定义枚举类

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
package com.hncj;

//自定义枚举类
public class Season{
//1、声明对象属性:private final
private final String seasonName;
private final String seasonDesc;

//2、私有化构造器
private Season(String seasonName, String seasonDesc) {
this.seasonName = seasonName;
this.seasonDesc = seasonDesc;
}

//3、提供当前枚举类的多个对象
public static final Season SPRING = new Season("春天", "春暖花开");
public static final Season SUMMER = new Season("夏天", "夏日炎炎");
public static final Season AUTUMN = new Season("秋天", "秋高气爽");
public static final Season WINTER = new Season("冬天", "凛冬将至");

//4、获取枚举类对象属性
public String getSeasonName() {
return seasonName;
}

public String getSeasonDesc() {
return seasonDesc;
}

@Override
public String toString() {
return "Season{" +
"seasonName='" + seasonName + '\'' +
", seasonDesc='" + seasonDesc + '\'' +
'}';
}
}

class SeasonTest {
public static void main(String[] args) {
Season spring = Season.SPRING;
System.out.println(spring);
System.out.println(spring.getSeasonName());
}
}

enum关键字定义枚举类

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
package com.hncj;

//使用enum关键字定义枚举类
public enum SeasonEnum {
//1、提供当前枚举类对象
SPRING("春天", "春暖花开"),
SUMMER("夏天", "夏日炎炎"),
AUTUMN("秋天", "秋高气爽"),
WINTER("冬天", "凛冬将至");

//2、对象属性私有化:private final
private final String seasonName;
private final String seasonDesc;

//3、私有化构造器
private SeasonEnum(String seasonName, String seasonDesc) {
this.seasonName = seasonName;
this.seasonDesc = seasonDesc;
}
//4、4、获取枚举类对象属性
public String getSeasonName() {
return seasonName;
}

public String getSeasonDesc() {
return seasonDesc;
}
}

class EnumTest{
public static void main(String[] args) {
SeasonEnum autumn = SeasonEnum.AUTUMN;
System.out.println(autumn);
//enum关键字定义的枚举类默认继承java.lang.Enum
System.out.println(SeasonEnum.class.getSuperclass());
}
}

枚举类常用方法

1、values()方法:返回枚举类型的对象数组。该方法可以很方便地遍历所有的枚举值。

2、valueOf(String objName):返回枚举类中对象名是objName的对象。如果没有会有运行时异常: IllegalArgumentException

3、 toString():返回当前枚举类对象常量的名称。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package com.hncj;

public class EnumMethod {
public static void main(String[] args) {
Family family = Family.FATHER;
System.out.println(family.toString()); //打印该对象名
Family[] values = Family.values(); //返回枚举类所有对象
for (Family value : values) {
System.out.println(value);
}
Family my = Family.valueOf("MY"); //返回当前枚举类对象常量的名称
System.out.println(my);
}
}

enum Family{
MOTHER,
FATHER,
MY;
}

枚举类实现接口

和普通Java类一样,枚举类可以实现一个或多个接口。

  • 若每个枚举值在调用实现的接口方法呈现相同的行为方式,则只要统一实现该方法即可。
  • 若需要每个枚举值在调用实现的接口方法呈现出不同的行为方式,则可以让每个枚举对象分别来实现该方法。
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
package com.hncj;

interface Info{
void show();
}

public enum SeasonEnum implements Info{
SPRING("春天", "春暖花开"){
@Override
public void show() { // 重写接口show方法
System.out.println("春天在哪里");
}
},
SUMMER("夏天", "夏日炎炎"){
@Override
public void show() {
System.out.println("宁夏");
}
},
AUTUMN("秋天", "秋高气爽"){
@Override
public void show() {
System.out.println("秋天不回来");
}
},
WINTER("冬天", "凛冬将至"){
@Override
public void show() {
System.out.println("大约在冬季");
}
};

private final String seasonName;
private final String seasonDesc;

private SeasonEnum(String seasonName, String seasonDesc) {
this.seasonName = seasonName;
this.seasonDesc = seasonDesc;
}

public String getSeasonName() {
return seasonName;
}

public String getSeasonDesc() {
return seasonDesc;
}

@Override
public void show() { // 如果枚举对象没有重写,则调用该重写方法。
System.out.println("四季");
}
}

class EnumTest{
public static void main(String[] args) {
SeasonEnum[] values = SeasonEnum.values();
for (SeasonEnum value : values) {
System.out.println(value);
value.show(); // 调用枚举类对象重写的接口方法
}
}
}