gpt4 book ai didi

java - 自动关闭合约 : writing to resource allowed in close()?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:33:27 24 4
gpt4 key购买 nike

我在内部偶然发现了以下结构:

class OurXmlWriter implements AutoCloseable {
private XMLStreamWriter streamWriter;
public OurXmlWriter(OutputStream stream) {
streamWriter = XMLOutputFactory.newInstance()
.createXMLStreamWriter(outputStream, "UTF-8");
}

@Override
public void close() {
try {
// is this allowed?
streamWriter.writeEndDocument();
} catch (XMLStreamException e) {
throw new RuntimeException();
} finally {
try {
streamWriter.close();
} catch (XMLStreamException e) {
throw new RuntimeException();
}
streamWriter = null;
}
}
}

我们遇到的问题是:

try (OurXmlWriter writer = new OurXmlWriter(new FileOutputStream("output.xml"))) {
writer.writeStartTag();
// write some data elements correctly
throw new OutOfMemoryError(); // that's not done explicitly but happens
}

这仍然会调用 close() - 这样很好,但会导致 xml 正确关闭(尽管不可靠,因为我确信它不能保证在 Error)。

所以问题基本上是 XML 是有效的,尽管我们不希望它是有效的(所以输出不会意外地进一步处理以防错误被遗漏)。我正在考虑如何最好地处理这种情况 - 从 close() 中删除结束标记 - 这需要大量的分析重新测试 - 或者只是不使用 try-with-resource 来控制关于它是否被调用。

但我的一般问题是:AutoCloseable 契约(Contract)是否允许在您被告知要 close() 时仍然写入您的资源?我一直在阅读 javadoc,但它并没有明确禁止它。我错过了什么吗?

最佳答案

基本上 Javadoc 中没有任何内容表明不允许这样做,事实上它是这样说的

Note that unlike the close method of java.io.Closeable this close method is not required to be idempotent. In other words, calling this close method more than once may have some visible side effect, unlike Closeable.close which is required to have no effect if called more than once.

它允许有副作用,甚至不需要方法是幂等的。考虑到写文档结尾是一个相对不足为奇的副作用,我认为这没关系。但当然,仅仅因为它没有被禁止并不意味着它是被允许的,YMMV,基于意见,请查阅您的内部规则手册等。

关于java - 自动关闭合约 : writing to resource allowed in close()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48685494/

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