我需要设计一个将OutputStream作为参数的API方法。关于流的API设计建议
关闭API方法中的流还是让调用者关闭流是一种好习惯?
test(OutputStream os) {
os.close() //???
}
我需要设计一个将OutputStream作为参数的API方法。关于流的API设计建议
关闭API方法中的流还是让调用者关闭流是一种好习惯?
test(OutputStream os) {
os.close() //???
}
我认为它应该是对称的。
如果您未打开该流(可能是您的情况),则一般情况下您都不应关闭它。
除非API的目的是“完成流”,否则应该让调用者关闭。他首先拥有了它,他对此负责,并且他可能会决定将一些东西写入API,但最初并未设想。保持您的功能分离;它更可组合。
让用户关闭它。由于您在参数中使用OutputStream,所以我们可以认为用户已经创建并打开了它。所以,如果你关闭你的方法,它会不好。如果您只是将新的OutputStream作为参数并在您的方法中打开它,则无需将其作为参数,也可以在方法中关闭它。
不同的用例需要不同的模式,例如,取决于调用者是否需要在调用完成后读取或写入流。
关键的API设计规则是API应该指定无论是调用者还是调用方法关闭流的责任。尽管如此,如果打开流的代码也负责关闭它,它通常更简单和更安全。
考虑以下情况:methodA
应该打开一个流并将其传递给methodB
的情况,但有一个异常数据流被打开和methodB
进入try
/finally
声明,其结果是关闭它负责之间抛出。你需要编写它类似于下面的东西,以保证流不漏:
public void methodA() throws IOException {
InputStream myStream = new FileInputStream(...);
try {
// do stuff with stream
methodB(myStream);
} finally {
myStream.close();
}
}
/**
* @param myStream this method is responsible for closing myStream.
*/
public void methodB(InputStream myStream) throws IOException {
try {
// do more stuff with myStream
} finally {
myStream.close();
}
}
这不会泄露一个开放的流作为例外的结果扔在任何methodA
或methodB
(或错误!)。 (它适用于标准流类型,因为Closable
API指定close
在已关闭的流上调用时不起作用。)
+1对于“对称” – 2011-04-06 05:31:33