java枚举的应用

巧用枚举可以简化不少操作

java中的枚举我认为有以下几种用途

限定范围

这是枚举最基础的应用,作为参数或者响应可以限制取值范围,过于简单不加赘述

存储常量

java中的枚举实际上就是类的简化,所以大多数类的语法都能应用于枚举,比如成员变量和构造方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

public enum Demo {

FIRST(1,"ok"),

SECOND(2,"fail"),

;
private int code;
private String msg;

private Demo(int code,String msg){
this.code = code;
this.msg = msg;
}

}


和一般的常量类比起来,优点是可以将多种常量分组存放,比如http中常见的响应码由code和msg组成,各大框架一般都用枚举来存放

注意,由于枚举都只有一个实例,所以不能用来存储变量。题外话,rust的枚举可以存放变量,这一点还是很好的

实现设计模式

使用枚举可以轻松实现部分设计模式

单例模式

用普通类实现的单例模式有可能会被反序列化破坏(话说什么情况下才会去反序列化单例类啊),而使用枚举可以避免这一点

策略模式

策略模式是为了取代大量的if else,枚举也可以简单实现这一点

因为枚举是类,所以里面也可以有方法,例如这样写

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

public enum Demo {

FIRST(1,"ok"){

public void process(){
// do something
}
},

SECOND(2,"fail"){

public void process(){
// do something
}

},

;
private int code;
private String msg;

private Demo(int code,String msg){
this.code = code;
this.msg = msg;
}

public void process(){

}

}



常规的策略模式一般是将不同逻辑拆分到不同子类,再通过某种方式,比如工厂类来获取某个具体实现;使用枚举实现就只需要传一个枚举值就可以了;

相比起策略模式动则四五个类,枚举只需要在一个文件——也只能在一个文件——内写完所有逻辑;

不过缺点也很明显,枚举都是单实例,所以所有依赖都需要在方法参数上写出来,如果不同的实现需要不同的依赖,那参数表会很长,而且修改起来也比较繁琐

责任链模式

策略模式取代if else,责任链也可以说是取代循环类

用枚举实现和上面的代码几乎一模一样,只是在调用的时候写成这样

1
2
3
4
5

for(Demo d: Demo.values()){
d.process();// 也可以自行实现责任链中断
}


相比责任链模式,可以省去注册等流程,而且顺序也可以轻松调整,缺点就是调用上稍微麻烦一些


java枚举的应用
http://blog.inkroom.cn/2023/08/19/19Q3283.html
作者
inkbox
发布于
2023年8月19日
许可协议