解析内容 if else太多 请问优化代码?
//List<String> 内容
[ti:我本闺中一钗裙]
[oti:我本闺中一钗裙]
[jz:黄梅戏]
[jm:女驸马]
[ojm:女驸马]
[offset:-1]
[by:制作者]
[ver:驸马公主合唱]
[keys:民女,洞房]
[00:04.99](驸马):我本闺中一钗裙
[00:31.93](公主白):此话当真
[00:34.19](驸马):公主请看耳环痕
[00:59.33]<结束>
/**
* 解析唱段内容
*
* @param changDuan 唱段对象
* @param line 当前需要解析的内容 即上面 List<String> 每一行内容
* @param patternMap 唱段正则表达式 可以正则匹配上面 List<String> 内容
* @throws ParseLrcException
*/
private static void parseLrcContent(ChangDuan changDuan, String line, Map<String, Pattern> patternMap) throws ParseLrcException {
if (matcher(line, patternMap, LrcConstants.LrcRegEnum.TITLE.name())) {
changDuan.setName(getChangDuanInfoContent(line, LrcConstants.LrcRegEnum.TITLE.getStartIndex()));
} else if (matcher(line, patternMap, LrcConstants.LrcRegEnum.ORIGIN_TITLE.name())) {
changDuan.setOriginName(getChangDuanInfoContent(line, LrcConstants.LrcRegEnum.ORIGIN_TITLE.getStartIndex()));
} else if (matcher(line, patternMap, LrcConstants.LrcRegEnum.JUMU.name())) {
changDuan.setJuMu(getChangDuanInfoContent(line, LrcConstants.LrcRegEnum.JUMU.getStartIndex()));
} else if (matcher(line, patternMap, LrcConstants.LrcRegEnum.ORIGIN_JUMU.name())) {
changDuan.setOriginJuMu(getChangDuanInfoContent(line, LrcConstants.LrcRegEnum.ORIGIN_JUMU.getStartIndex()));
} else if (matcher(line, patternMap, LrcConstants.LrcRegEnum.OFFSET_REG.name())) {
changDuan.setOffset(Integer.parseInt(getChangDuanInfoContent(line, LrcConstants.LrcRegEnum.OFFSET_REG.getStartIndex())));
} else if (matcher(line, patternMap, LrcConstants.LrcRegEnum.JU_ZHONG.name())) {
changDuan.setJuZhong(getChangDuanInfoContent(line, LrcConstants.LrcRegEnum.JU_ZHONG.getStartIndex()));
} else if (matcher(line, patternMap, LrcConstants.LrcRegEnum.BEIZHU.name())) {
changDuan.setBeiZhu(getChangDuanInfoContent(line, LrcConstants.LrcRegEnum.BEIZHU.getStartIndex()));
} else if (matcher(line, patternMap, LrcConstants.LrcRegEnum.VERSION.name())) {
changDuan.setVersion(getChangDuanInfoContent(line, LrcConstants.LrcRegEnum.VERSION.getStartIndex()));
} else if (matcher(line, patternMap, LrcConstants.LrcRegEnum.KEYS.name())) {
changDuan.setSearchKeys(getChangDuanInfoContent(line, LrcConstants.LrcRegEnum.KEYS.getStartIndex()));
} else if (matcher(line, patternMap, LrcConstants.LrcRegEnum.BY.name())) {
changDuan.setMaker(getChangDuanInfoContent(line, LrcConstants.LrcRegEnum.BY.getStartIndex()));
} else {
throw new ParseLrcLineException(line);
}
}
上段代码是用于将List<String>解析成ChangDuan
想请教一下这个代码写的咋样,能否优化,我就是觉得if else太多了。
回复
1个回答
test
2024-06-24
抽象一个接口:
interface IMatchParser{
boolean matcher(String line, Map<String, Patter> map);
handle(ChangDuan changduan);
}
每个if分支抽象成一个类继承IMatchParser
;
public class MatchParser1 implements IMatchParser{
public void handle(ChangDuan changduan) {
changDuan.setName(getChangDuanInfoContent(line, LrcConstants.LrcRegEnum.TITLE.getStartIndex()));
}
public boolean matcher(String line, Map<String, Patter> map) {
return matcher(line, patternMap, LrcConstants.LrcRegEnum.TITLE.name());
}
}
然后放到一个list中:
List<IMatchParser> list = new ArrayList();
list.add(new MatchParser1());
list.add(new MatchParser2());
...
然后实现方法变成:
private static void parseLrcContent(ChangDuan changDuan, String line, Map<String, Pattern> patternMap) throws ParseLrcException {
for (IMatchParser parser: list) {
if (parser.match(line, patternMap)) {
parser.handle(changDuan);
break;
}
}
}
后续加新的if分支只需要实现一个新的class插入到list即可
回复
适合作为回答的
- 经过验证的有效解决办法
- 自己的经验指引,对解决问题有帮助
- 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
- 询问内容细节或回复楼层
- 与题目无关的内容
- “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容