如何简化此解析方法?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何简化此解析方法?相关的知识,希望对你有一定的参考价值。
我正在编写代码来从文件中解组XML。我不知道XML基于哪个模式,所以我尝试用不同Jaxb2Marshaller实例形式的几个模式解组它。
该方法需要:
- 尝试用每个编组器解组XML
- 如果成功,则返回结果对象
- 如果失败,请尝试下一个编组
- 如果所有marshallers都失败,请使用上一条错误消息抛出异常
这是当前的代码:
private Object getObject(final byte[] data) throws MyException {
String lastErrorMessage = "";
for (final Jaxb2Marshaller marshaller : this.marshallers) {
try {
return marshaller.unmarshal(new StreamSource(new ByteArrayInputStream(data)));
} catch (final XmlMappingException e) {
LOGGER.warn("Invalid XML", e);
lastErrorMessage = e.getMessage();
}
}
throw new MyException(lastErrorMessage);
}
我觉得这个方法在不同的抽象层次上做了太多事情:
- 迭代marshallers
- 申请编组
- 返回结果
- 捕捉异常
- 抛出异常
但我没有看到简化它的方法。每个编组器都需要try-catch块(因为我应该捕获并忽略除最后一个之外的这些XmlMappingExceptions)。该块要么返回一个结果对象,要么返回迭代后需要的lastErrorMessage来抛出MyException。
我能想到的唯一解决方案是创建一些人为的Result类,它包含结果对象或错误消息,但感觉很笨拙。还有其他见解吗?
答案
我想要像这样的粒度方法:
private Object getObject(byte[] data) throws MyException {
Result result;
for (Jaxb2Marshaller marshaller : this.marshallers) {
result = getObject(marshaller, data);
}
return handleError(result);
}
private Result getObject(Jaxb2Marshaller marshaller, byte[] data) {
try {
return Result.value(marshaller.unmarshal(new StreamSource(new ByteArrayInputStream(data))));
} catch (final XmlMappingException e) {
LOGGER.warn("Invalid XML", e);
return Result.error(e.getMessage());
}
}
private Object handleError(Result result) {
if (result.isError()) {
throw new MyException(result.errroMessage);
}
else {
return result.value;
}
}
但是附加的Result类是冗长而且笨拙的:
private class Result {
String errorMessage;
Object value;
static Result error(String errorMessage) {
Result result = new Result();
result.errorMessage = errorMessage;
return result;
}
static Result value(Object value) {
Result result = new Result();
result.value = value;
return result;
}
boolean isError() {
return errorMessage != null;
}
}
以上是关于如何简化此解析方法?的主要内容,如果未能解决你的问题,请参考以下文章
为啥我的 C 代码片段不起作用?简化版可以。为 unsigned long long 传递不带 VA_ARGS 的 args