2011-04-06 92 views
2

我需要设计一个将OutputStream作为参数的API方法。关于流的API设计建议

关闭API方法中的流还是让调用者关闭流是一种好习惯?

test(OutputStream os) { 

os.close() //??? 
} 

回答

6

我认为它应该是对称的。

如果您未打开该流(可能是您的情况),则一般情况下您都不应关闭它。

+0

+1对于“对称” – 2011-04-06 05:31:33

3

除非API的目的是“完成流”,否则应该让调用者关闭。他首先拥有了它,他对此负责,并且他可能会决定将一些东西写入API,但最初并未设想。保持您的功能分离;它更可组合。

3

让用户关闭它。由于您在参数中使用OutputStream,所以我们可以认为用户已经创建并打开了它。所以,如果你关闭你的方法,它会不好。如果您只是将新的OutputStream作为参数并在您的方法中打开它,则无需将其作为参数,也可以在方法中关闭它。

0

不同的用例需要不同的模式,例如,取决于调用者是否需要在调用完成后读取或写入流。

关键的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(); 
     } 
    } 

这不会泄露一个开放的流作为例外的结果扔在任何methodAmethodB(或错误!)。 (它适用于标准流类型,因为Closable API指定close在已关闭的流上调用时不起作用。)