代码优化:常量中枚举与表驱动的应用
常量的简单理解就是不会变化的量,在我们程序开发时总会遇到这么一些,例如状态类:开机/关机/异常,颜色类:黄/红/蓝/绿 等等。运用的方式也有很多,直接声明或写死(以前年轻经常这么干以为很省事,事实证明修改及出问题排查时给自己找不痛快,极度不推荐)、常量类、枚举等。此次我们这里不讨论用哪种方式,我主要用的枚举并应用了下表驱动,下面我们直接以代码说明。
先上个我以前写的,或者说是常用的通过值获取枚举的方法:
public static MyEnum getByCode(int code) {
for (MyEnum element : values()) {
if (element.code.equals(code)) {
return element;
}
}
return null;
}
看看你之前是不是这么写的?我之前就是这么写的,写时觉得哪里有些不对,但也挺整洁,由于项目进度问题当时也不去过多考虑,之后想想这样岂不是每次获取都遍历一遍?虽然知道可能会影响效率、不优雅,但也不知道该如何去改~ 后来了解到了表驱动这么个概念,其实早在N年前就知道了( 从《代码大全》中看的,有兴趣的可以看看 ),讲的是运用数组来简化if…else if或switch的方法,那时候就是觉得一个字妙,但实际我并没有懂,只是有个印象,并没有举一反三运用知识去处理实际问题,后来我想到了去运用,但是又不知该从何下手,但也有了大致方向,通过查阅资料以及实践等重复造轮子… 好了不讲历史了直接上代码。
import java.util.HashMap;
import java.util.Map;
/**
* @Author: Wenx
* @Description: 枚举表驱动示例
* @Date: Created in 2018/11/5 11:02
* @Modified By:
*/
public enum MyEnum {
/**
* 00=开机
*/
STARTUP(0x00, "开机"),
/**
* 01=关机
*/
SHUTDOWN(0x01, "关机"),
/**
* 02=锁定
*/
LOCKING(0x02, "锁定");
/**
* 编码
*/
private final int code;
/**
* 名称
*/
private final String name;
private static final Map<Integer, MyEnum> MAP = new HashMap<>();
static {
for (MyEnum element : values()) {
MAP.put(element.code, element);
}
}
MyEnum(int code, String name) {
this.code = code;
this.name = name;
}
public int getCode() {
return code;
}
public String getName() {
return name;
}
public static MyEnum getByCode(int code) {
return MAP.get(code);
}
}
总结:我这其实也算重复造轮子了,其实重复造轮子也挺好,前提是你看过其他轮子。最早我是闭门造车;后来发现我的一些想法和某些成型产品不谋而合(有想法的人还是蛮多的,自己也不是那么NB),人家的成型产品比我想的要全面要好(一个团队的力量始终还是比个人大一些的);从那开始我对重复造轮子失去了兴趣,反而对组装开始感兴趣(产品选型及组合运用);多年后又觉得重复造轮子也挺好,因为那轮子始终是别人的,重复造了一遍才能是自己的,有了自己的轮子才能造自己的车,这样才能有坚实的基础,才够优雅~ 当然这都是个人看法,不喜欢请轻喷~