之前在做网盘系统有这么一个需求,根据上传文件的类型,来选择上传服务器的位置。
需求:
需求如下:
根据以下文件类型
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
|
public interface UploadService {
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
|
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