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

Java 如何在构造函数中处理Writer、Result、OutputStream?,java,constructor,Java,Constructor,我有一个类,它封装了一个用于特殊业务XML编写的StAX编写器。您可以将其推入一些域对象,逻辑生成适当的XML 出于安全原因,我不想提供XMLStreamWriter实例,因此这个类是唯一负责写入这个writer的类。XMLStreamWriter将在此类中实例化。为了支持几乎所有的输出变体,例如Result、OutputStream和Writer,我还为这些变体提供了构造函数 public CustomStreamWriter ([...], Result result) { th

我有一个类,它封装了一个用于特殊业务XML编写的StAX编写器。您可以将其推入一些域对象,逻辑生成适当的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);
    }
}

当我看到它时,我认为这是非常丑陋的,而且不是一个实现这一点的好方法。Stackoverflow,你有什么提示吗?

我会这样写的

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

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

如果构造函数抛出异常,则构造函数无法处理该异常并创建有效对象,因此抛出异常是一种明智的处理方法。

好吧,在我上次工作的地方,他们会让我将
newInstance
createXMLStreamWriter
中的所有错误包装到自定义异常中,这就是为什么我删除了我的答案。(有点像公司标准,也不一定是坏标准)但如果没有这样的要求,这应该可以。@Nikita,我确实看到了你的解决方案,但没有看到包装/伪装异常的意义,除非你正在添加一些值(或者你必须这样做)。事实上,我甚至使用了Thread.currentThread().stop(e)而不是包装一个选中的异常。关键是可用性。不要仅仅因为您使用了3个不同的内部库,它们生成15种不同的异常类型,就让用户使用15个catch块。如果你在设计API,这是有道理的。@Nikita,不确定这在现实中是否会发生。您永远不需要执行两个或三个以上的不同操作来处理异常,其余操作可以由通用捕获异常捕获。