最近,公司安排我去参与重构一个ODN项目,其中有一条要求是把现有的仅支持单一公司Box的代码提升为支持多厂家,经过讨论组合指令采用了策略,进行了抽取优化,但是对单一指令却无法抽取,因为各个厂家的数据体不同,相同指令要求的参数也不同,这给我们带来了很大的苦恼。我经过仔细分析业务流程,发现不论哪一个厂家的指令,最简单的情况是命令直接是固定的,最复杂的情况是,本次的命令需要上面好几个命令的结果,这既是多厂家适配的难处却也是解决的问题最恰当的切入点,我是这样考虑的:不管哪个厂家,指令之间即使有关联,如果我们把每次发送命令的结果储存到公共的区域中,而且相同的命令是会覆盖之前的命令结果,这样每个厂家拿着自己的key必定能正确找到发起命令所需的数据
关于这个映射表,我也想过使用json文件的形式进行配置,但是考虑到需要进行Gosn解析,不适合在代码中直接引用,故考虑使用enum枚举类型。
1. enum枚举简单使用
enum枚举的引入,就是为了方便处理如一年12月,一周7天等这类有固定范围的数据,如下就是一个简单的enum类:
public enum Layout{
TOP,BUTTOM,LEFT,RIGHT
}
引入了enum的java的列举的编写方便了许多,只须定义一个enum型的对象.enum对象的值都会自动获得一个数字值,从0开始,依次递增。
2. enum的常用方法
3.enum的属性调用:
enum属性在调用处,通常情况下使用的是Enum名.Enum值访问,但是有一个地方需要注意,当在switch中使用enum时,不需要使用Enum名.Enum值形式,只需要Enum值即可。
4.为Enums添加属性和方法:
enums也可以象一般的类一样添加方法和属性,你可以为它添加静态和非静态的属性或方法,这一切都象你在一般的类中做的那样。就是这么的简单.但是有一点是需要注意的,那就是enums的值列表必须紧跟在enum声明,不然编译时将会出错,类似下面的形式:
READ_PORTS_INFO(new char[]{0x1105, 0x11A5, 0x0000}),
5.Enums构造函数:
当使用上述形式强制为每个enum值设置值时,则必须创建这样的构造方法,来进行赋值,如下所示:
/**
* 用于替换命令码的映射表,Value采用行标在前,自定义命令在后(厂商依次为:行标,太平,华脉...)
*/
public enum MappingTable {
/**
* 特殊命令,box随时有可能直接发给客户端
*/
ALERT(new char[]{0x0000, 0x5A11, 0x0000});
private final char[] value;
char[] getValue() {
return value;
}
MappingTable(char[] value) {
this.value = value;
}
}