gpt4 book ai didi

java - 如何简化这种解析方法?

转载 作者:行者123 更新时间:2023-12-03 08:45:29 25 4
gpt4 key购买 nike

我正在编写代码以从文件中解码 XML。我事先不知道 XML 基于哪个模式,所以我尝试使用不同 Jaxb2Marshaller 实例形式的多个模式来解码它。

该方法需要:

  • 尝试使用每个编码器解码 XML
  • 如果成功,则返回结果对象
  • 如果失败,请尝试下一个 marshaller
  • 如果所有 marshaller 都失败,则抛出带有最后一条错误消息的异常

  • 这是当前代码:
    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);
    }

    我觉得这种方法在不同的抽象层次上做了太多的事情:
  • 遍历编码器
  • 申请编码器
  • 返回结果
  • 捕获异常
  • 抛出异常

  • 但我看不到简化它的方法。每个编码程序都需要 try-catch block (因为我应该捕获并忽略这些 XmlMappingExceptions,除了最后一个)。该 block 要么返回一个结果对象,要么返回 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;
    }
    }

    关于java - 如何简化这种解析方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55747701/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com