Java 如何在构造函数中处理Writer、Result、OutputStream?
我有一个类,它封装了一个用于特殊业务XML编写的StAX编写器。您可以将其推入一些域对象,逻辑生成适当的XML 出于安全原因,我不想提供Java 如何在构造函数中处理Writer、Result、OutputStream?,java,constructor,Java,Constructor,我有一个类,它封装了一个用于特殊业务XML编写的StAX编写器。您可以将其推入一些域对象,逻辑生成适当的XML 出于安全原因,我不想提供XMLStreamWriter实例,因此这个类是唯一负责写入这个writer的类。XMLStreamWriter将在此类中实例化。为了支持几乎所有的输出变体,例如Result、OutputStream和Writer,我还为这些变体提供了构造函数 public CustomStreamWriter ([...], Result result) { th
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,不确定这在现实中是否会发生。您永远不需要执行两个或三个以上的不同操作来处理异常,其余操作可以由通用捕获异常捕获。