Java基础之枚举(Enum)

Java中枚举的表示法


基本思想

  • Java枚举类型是完整的类,其枚举本质是int值。
  • 通过public static final属性为每个枚举常量导出一个实例的类,由于没有可访问的构造函数,所以枚举类型实际上也是final的。
  • 逻辑上来说,每一个enum都是Enum<T>类型本身的一个实例。
1
2
3
4
5
6
7
8
9
10
11
public enum Direction{
EAST, WEST, NORTH, SOUTH;
}

//等价于:
final class Direction extends Enum<Direction>{
public static final Direction EAST = new Direction();
public static final Direction WEST = new Direction();
public static final Direction NORTH = new Direction();
public static final Direction SOUTH = new Direction();
}
  • 枚举的属性字段必须是private类型,最好加上final进行修饰!!!

语法

每一个枚举含一个大写的枚举名(如PUBLISHED)和一串枚举属性值(如code和desc),枚举之间以“,”分隔,以“;”结尾。

如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public enum CommentStatusEnum{
PUBLISHED(0,"已发布"),
CHECKING(1,"待审核"),
RECYCLE(2,"回收站");

private Integer code; //状态码
private String desc; //描述

//构造方法
CommentStatusEnum(Integer code, String desc) {
this.code = code;
this.desc = desc;
}

//Getter & Setter
}

使用Enum替代boolean

即使某个成员只有两种状态,也不要将它设置为boolean类型,而是应该设置为enum,原因有2:

  1. boolean类型只有true/false,意义不明,enum可以设置有意义的描述
  2. 如果新增第三种状态,boolean类型无法扩展,enum则可以很好地扩展
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//boolean flag = true;
//使用枚举代替boolean
public enum Flag{
FAILED(0, "失败"),
SUCCESS(1, "成功"),
NOTHING(3, "新增的一种状态,没有什么卵用");

private int code;
private String desc;

public Flag(int code, Strng desc) {
this.code = code;
this.desc = desc;
}
}

API

1.ordinal()

  • 返回一个枚举在定义时的顺序值index,从0开始。
  • ordinal()是为了复杂的基于枚举的数据结构设计的,比如EnumSet/EnumMap
1
2
Direction.EAST.ordinal();   //0
Direction.SOUTH.ordinal(); //3

2.values()

  • 以枚举数组的形式返回所有枚举类型。
1
2
3
4
5
6
7
8
9
Direction[] directions = Direction.values();
for(Direction d : directions) {
System.out.println(d)
}
//输出:
//EAST
//WEST
//NORTH
//SOUTH

3.valueOf()

  • 通过String获取枚举实例。
1
2
3
4
Direction east = Direction.valueOf("EAST");
System.out.println(east);
//输出:
//EAST

枚举集合类

1.java.util.EnumSet

  • 高性能枚举Set所有元素需要是同一种枚举类型,元素顺序根据枚举定义时的顺序决定,即与ordinal()返回一致
  • 非线程安全
  • 不允许null元素
1
2
3
4
5
public abstract class EnumSet<E extends Enum<E>>
extends AbstractSet<E>
implements Cloneable, Serializable{
//...
}

通过EnumSet.of()进行构造

1
2
3
4
Set enumSet = EnumSet.of(Direction.EAST,
Direction.WEST,
Direction.NORTH,
Direction.SOUTH);

2.java.util.EnumMap

  • 高性能枚举Mapkey值是枚举类型,需要是同一种枚举类型。
  • 非线程安全
  • 不允许null元素
1
2
3
public abstract class EnumMap<K extends Enum<K>,V>
extends AbstractMap<K,V>
implements Serializable, Cloneable {...}

传入类进行构造,通过put()传值

1
2
3
4
Map enumMap = new EnumMap(CommentStatusEnum.class);
//key是枚举类型
enumMap.put(CommentStatusEnum.PUBLISHED, CommentStatusEnum.PUBLISHED.getCode());
enumMap.put(CommentStatusEnum.CHECKING, CommentStatusEnum.CHECKING.getCode());

使用接口模拟可扩展的枚举

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
public interface Operation{
double apply(double x, double y);
}

public enum BasicOperation implements Operation{
PLUS("+") {
public double apply(double x, double y) {
return x + y;
}
},
MINUS("-") {
public double apply(double x, double y) {
return x - y;
}
};

private final String symbol;

BasicOperatio(String symbol) {
this.symbol = symbol;
}

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

public enum ExtendedOperation implemenets Operation{
MULTI("*") {
public double apply(double x, double y) {
return x * y;
}
},
DIVIDE("/") {
public double apply(double x, double y) {
return x / y;
}
};

private final String symbol;

ExtendedOperation(String symbol) {
this.symbol = symbol;
}

@Override
public String toString() {
return symbol;
}
}
-------------本文结束感谢您的阅读-------------

本文标题:Java基础之枚举(Enum)

文章作者:DragonBaby308

发布时间:2019年05月22日 - 20:00

最后更新:2019年09月22日 - 10:08

原始链接:http://www.dragonbaby308.com/JavaBase-Enum/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

急事可以使用右下角的DaoVoice,我绑定了微信会立即回复,否则还是推荐Valine留言喔( ఠൠఠ )ノ
0%