今天写代码看到这种写法,哪位朋友给分析一下好处?
原来的写法:
public static final String VERSION_1 = "1_native";
public static final String VERSION_2 = "2_native";
public static final String VERSION_3 = "3_native";
public static final String VERSION_4 = "native_202207";
...
if (VERSION_1.equals(version) ||
VERSION_2.equals(version) ||
VERSION_3.equals(version) ||
VERSION_4.equals(version)){
log.debug("Call " + version +" begin, senderId is " + cmd.getSenderID());
handleNative(很多参数);
return;
....
改了的写法:
public enum VersionEnum {
VERSION_1("1_native"),
VERSION_2("2_native"),
VERSION_3("3_native"),
VERSION_4("native_202207"),
private String version;
VersionEnum( String version) {
this.version = version;
}
public String getVersion() {
return version;
}
}
...
VersionEnum versionEnum = VersionEnum.valueOf(version);
switch (versionEnum) {
case VERSION_1:
case VERSION_2:
case VERSION_3:
case native_202207:
log.debug("Call " + version +" begin, senderId is " + cmd.getSenderID());
handleNative(很多参数);
return;
}
...
还可以怎么改进?
public enum VersionEnum {
VERSION_1("1_native"),
VERSION_2("2_native"),
VERSION_3("3_native"),
VERSION_4("native_202207"),;
private String version;
VersionEnum( String version) {
this.version = version;
}
public String getVersion() {
return version;
}
/**
* 匹配
* @return
*/
public static boolean match(String version){
return Arrays.stream(values()).anyMatch(versionEnum -> versionEnum.getVersion().equals(version));
}
}
if (VersionEnum.match(version)){
log.debug("Call " + version +" begin, senderId is " + cmd.getSenderID());
handleNative(很多参数);
}
用啥switch 啊,如果给的version不在哪几个里面,那么 versionEnum 就是null的,switch 就报错了;
看你这情形只需要判断 versionEnum 不是null就可以 执行 handleNative(很多参数);了
VersionEnum versionEnum = VersionEnum.valueOf(version);
if( versionEnum != null){
log.debug("Call " + version +" begin, senderId is " + cmd.getSenderID());
handleNative(很多参数);
return;
}
enum枚举,这个我搞课设项目会用上这个耶,你可以去找找enum这个关键字相关的内容,自己找找区别
区别没多大吧……而且第二种更难懂,毕竟switch用的还是比较少的。
而且第二种也不好改
public static final List<String> list = Arrays.asList("1_native", "2_native", "3_native", "native_202207");
if(list.contains("输入的值")){
//do SomeThing
}
这种代码没必要改进,没什么技术含量体现
加了新版本号,不想改代码。首先,版本号要放到配置文件里,配置文件用propertries文件,key和value一样。系统启动的时候,初始化到一个map里,key和value都放版本号。判断时调用map的containsKey方法。
如果加新版本,不想重启应用,就加一个线程监控配置文件,变化了就更新map。
枚举类是很优雅,但是本身不支持动态创建(动态创建也可以,比较麻烦)。新加版本就要改代码,重新部署应用。真实的项目,上线后,重新部署应用,是非常麻烦滴。