最近用 java 做 redis-server 的实现, 很多命令行参数的地方,例如:
STRING 有个操作 SET key value [EX seconds] [PX milliseconds] [NX|XX]
参数说明见这里.
常规做法是
String args[] = .... // 参数列表
Params param = new Params(); // 解析后的参数
for (int i = 0; i < args.length; i++) {
if (args[i].equalsIgnoreCase("ex")) {
param.milliseconds = args[i + 1] * 1000;
} else if (args[i].equalsIgnoreCase("px")) {
param.milliseconds = args[i + 1];
}
....
}
现在我们用 enum (枚举) 来取代 if-else
首先我们 创建一个 enum , 使用参数的前缀 key 作为 name :
public enum Parser {
EX, PX, NX, XX
}
我们添加一个抽象的方法 public abstract int parse(SetParams params, String[] args, int i);
根据字符串参数解析需要参数.返回最后被解析的字符串位置.
public enum Parser {
EX, PX, NX, XX;
public abstract int parse(Params params, String[] args, int i);
}
然后我们对每个枚举元素, 实现该方法
public enum Parser {
EX {
@Override
public int parse(Params params, String[] args, int i) {
params.ex = args[i + 1].byteArray2int();
return i + 1;
}
},
PX {
@Override
public int parse(Params params, String[] args, int i) {
params.px = args[i + 1].byteArray2long();
return i + 1;
}
},
NX {
@Override
public int parse(Params params, String[] args, int i) {
params.nx = true;
return i;
}
},
XX {
@Override
public int parse(Params params, String[] args, int i) {
params.xx = true;
return i;
}
};
public abstract int parse(Params params, String[] args, int i);
}
这样我们就可以用取代 if-else 了:
String args[] = .... // 参数列表
Params param = new Params(); // 解析后的参数
for (int i = 0; i < args.length; i++) {
String op = args[i];
Parser pm = Parser.valueOf(op.toUpperCase());
i = pm.parse(spm, args, i);
}
(完)