解析内容 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太多了。


回答:

抽象一个接口:

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即可


回答:

使用表驱动设计模式即可

以上是 解析内容 if else太多 请问优化代码? 的全部内容, 来源链接: utcz.com/p/945467.html

回到顶部