使用枚举类重构if-else/switch

HYF Lv3

之前在做网盘系统有这么一个需求,根据上传文件的类型,来选择上传服务器的位置。

需求:

需求如下:

根据以下文件类型
fileType: [audio|video|image|other]
来选择对应的上传地址
url [url1|url2|url3|url4]

实现:

if-else 实现

1
2
3
4
5
6
7
8
9
10
11
12
13
String fileType = MimeTypeUtils.getMimeType(file);
if ("audio".equals(fileType)) {
upload(file, url1);
}
if ("video".equals(fileType)) {
upload(file, url2);
}
if ("image".equals(fileType)) {
upload(file, url3);
}
if ("other".equals(fileType)) {
upload(file, url4);
}

if-else 的实现方式简单明了,我为什么要重构? (本文完)

switch 实现

1
2
3
4
5
6
7
8
9
10
11
12
13
switch (MimeTypeUtils.getMimeType(file)) {
case "audio":
upload(file, url1);
break;
case "video":
upload(file, url2);
break;
case "image":
upload(file, url3);
break;
default:
upload(file, url4);
}

用 switch 的方式替换 if-else ,这顿操作没有 250 的智商根本写不出来,不愧是我!

重构

我们可以将业务需求抽象出一个接口,定义上传方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/**
* @author -侑枫
* @date 2023/8/15 23:36:26
*/
public interface UploadService {
/**
* 上传文件的方法
*
* @param file 文件
* @return
*/
Boolean uploadByType(MultipartFile file);
}

定义一个枚举类型 UploadEnum,实现了一个 UploadService 接口。这个枚举类型中包含了几个枚举常量,每个常量都表示一种上传类型,比如 “audio”、”video”、”image” 和 “other”。每个枚举常量都实现了 UploadService 接口,并提供了针对不同文件类型的上传逻辑。

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
/**
* @author -侑枫
* @date 2023/8/15 23:43:35
*/
public enum UploadEnum implements UploadService {
upload1("audio") {
@Override
public Boolean uploadByType(MultipartFile file) {
String url = "url1";
System.out.println("文件类型为:" + upload1.fileType + " 已上传至:" + url);
return upload(file, url);
}
},
upload2("video") {
@Override
public Boolean uploadByType(MultipartFile file) {
String url = "url2";
System.out.println("文件类型为:" + upload2.fileType + " 已上传至:" + url);
return upload(file, url);
}
},
upload3("image") {
@Override
public Boolean uploadByType(MultipartFile file) {
String url = "url3";
System.out.println("文件类型为:" + upload3.fileType + " 已上传至:" + url);
return upload(file, url);
}
},
upload4("other") {
@Override
public Boolean uploadByType(MultipartFile file) {
String url = "url4";
System.out.println("文件类型为:" + upload4.fileType + " 已上传至:" + url);
return upload(file, url);
}
};

private final String fileType;

UploadEnum(String fileType) {
this.fileType = fileType;
}

public static boolean upload(MultipartFile file, String url) {
return true;
}

public static UploadService handler(String fileType) {
for (UploadEnum uploadEnum : UploadEnum.values()) {
if (Objects.equals(uploadEnum.fileType, fileType)) {
return uploadEnum;
}
}

throw new RuntimeException("文件类型非法!");
}
}

handler(String fileType) 方法通过传入 fileType 值,来选择对应的枚举常量(不同的实现类)。
uploadByType(MultipartFile file) 是枚举常量实现的方法,参数是一个 MultipartFile 对象,表示要上传的文件。本方法用于根据文件类型执行相应的上传逻辑。

1
2
3
String fileType = MimeTypeUtils.getMimeType(file);
Boolean upload = UploadEnum.handler(fileType).uploadByType(file);
System.out.println(upload ? "上传成功" : "上传失败");

执行结果:

1
2
3
4
文件类型为:audio 已上传至:url1
上传成功

Process finished with exit code 0

后续如果要新增文件类型及服务器位置,我们只需要在枚举类里新加一个枚举常量就行了,其它都不用修改,维护起来比较方便。(switch 新加一个 case 不也一样吗?哈哈哈哈)


最后附上本文所写源代码:使用枚举类重构if-else/switch

  • 标题: 使用枚举类重构if-else/switch
  • 作者: HYF
  • 创建于 : 2023-08-15 23:26:32
  • 更新于 : 2024-04-17 01:26:35
  • 链接: https://youfeng.ink/enums-refactor-if-else-or-switch-af99d42c3b05/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
此页目录
使用枚举类重构if-else/switch