gpt4 book ai didi

由网络连接支持的 Java 迭代器

转载 作者:搜寻专家 更新时间:2023-11-01 03:43:24 24 4
gpt4 key购买 nike

我发现自己经常编写提供 Iterator<Foo> 的 API这是由网络连接支持的。该实现打开网络连接,从流中读取信息,并将该信息反序列化为 Foo。 s 传递给调用者。不幸的是,总是有可能出现 IOException还需要优雅地关闭网络连接(当调用者读取最后一个 Foo 时可以自动关闭,但如果没有发生怎么办?)。

已经有几个问题(herehere)关于如何处理在 Iterator 的实现中抛出的检查异常。 ,并且接受的建议是“将它们包装在未经检查的 RuntimeException 中”。同时允许关闭网络连接我们可以实现Closeable .所以对于一个行为良好的异常检查调用者,我们最终得到这样的结果:

Iterator<Foo> iter = null;
try {
iter = getFooIterator();
while(iter.hasNext()) {
Foo foo = iter.next();
// do something with foo
}
}
catch(RuntimeException e) {
if(e.getCause() instanceof IOException) {
// do something with the IOException
}
else throw e;
}
finally {
if(iter instanceof Closeable) try { ((Closeable)iter).close(); } catch(IOException e) {}
}

实现 Iterator 似乎是个不错的主意.有没有更好的办法?

最佳答案

IMO 的第一步是将其包装在特定于实现或特定于应用程序的异常中,从而无需捕获通用 RuntimeException 或检查根本原因。

我会考虑一个特定的实现来避免可关闭检查并结束 IOException

NetworkIterator<Foo> iter = null;
try {
iter = getFooIterator();
while (iter.hasNext()) {
Foo foo = iter.next();
// do something with foo
}
} catch (NetworkIteratorExceptiom e) {
// do something with the IOException
} finally {
iter.close();
}

我可能不会给它方法让样板文件消失,但我会被诱惑;大致:

NetworkIterator<Foo> iter = new IteratorThang<Foo>() {
@Override public void each(Foo foo) {
// Do something with foo
}
};

关于由网络连接支持的 Java 迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8994701/

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