如何在构造函数中处理Writer、Result和OutputStream?

3
我有一个类,封装了一个StAX Writer,用于特定业务XML写入。您可以将一些领域对象推入其中,逻辑将生成相应的XML。
出于安全原因,我不想提供XMLStreamWriter实例,因此这个类是唯一负责向这个writer写入的类。XMLStreamWriter将在此类中被实例化。为了支持几乎所有输出变体,例如Result、OutputStream和Writer,我还提供了这些变体的构造函数。
public CustomStreamWriter ([...], Result result) {
      this([...], (Object) result);
}

public CustomStreamWriter ([...], OutputStream outputStream) {
      this([...], (Object) outputStream);
}

public CustomStreamWriter ([...], Writer writer) {
      this([...], (Object) writer);
}

protected CustomStreamWriter ([...], Object outputHandler) {
    // Initialize some final fields and do some stuff with [...]
    XMLOutputFactory factory = XMLOutputFactory.newInstance();

    if(outputHandler instanceof OutputStream) {
       this.writer = factory.createXMLStreamWriter((OutputStream) outputHandler);
    } else if(outputHandler instanceof Result) {
       this.writer = factory.createXMLStreamWriter((Result) outputHandler);
    } else if(outputHandler instanceof Writer) {
       this.writer = factory.createXMLStreamWriter((Writer) outputHandler);
    }
}

当我看到这个时,我觉得它很丑,并不是一种整洁的实现方式。 Stack Overflow,你有什么提示吗?

1个回答

1

我会这样写。

public CustomStreamWriter ([...], Writer writer) throws XMLStreamException {
    this([...], XMLOutputFactory.newInstance().createXMLStreamWriter(writer);
}

protected CustomStreamWriter ([...], XMLStreamWriter outputHandler) {
    this.writer = writer;
}

如果构造函数抛出异常,构造函数无法处理并创建有效的对象,因此抛出异常是解决此问题的明智方式。


在我上一个工作场所,他们会强制要求我将newInstancecreateXMLStreamWriter的所有错误都包装成自定义异常,这就是为什么我删除了我的答案。(这是一种企业标准,不一定是坏事)但如果没有这样的要求,这个方法应该可以工作。 - Nikita Rybak
@Nikita,我看到了你的解决方案,但是除非你添加了一些价值(或者必须这样做),否则我不明白包装/伪装异常的意义。 - Peter Lawrey
事实上,我甚至使用Thread.currentThread().stop(e)而不是包装已检查的异常。 - Peter Lawrey
重点在于可用性。不是让用户使用15个catch块,只因为您使用了3个不同的内部库,产生了15种不同的异常类型。如果您正在设计API,那么这是有意义的。 - Nikita Rybak
@Nikita,不确定这种情况在现实中是否会发生。您永远不需要执行超过两到三个不同的操作来处理异常,其余的可以通过通用的catch Exception捕获。 - Peter Lawrey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接