有个方法f1()返回Instream,另一个方法f2(Instream)以Instream作为对象,这两个方法都是别人实现。使用这两个方法如下
myfun(){
Instream in=f1();
f2(in);
}
那关闭Instream是应在f1中还是f2()中或在myfun中的调用f2()后,用in.close();关闭?
如果myfun实现改为
myfun(){
f2(f1());
}
又如何了?

解决方案 »

  1.   

    应该是在调用f2()后用in.close();来关闭
      

  2.   

    一般情况下这样的设计是不合理的,不能这么设计,象Stream,ResultSet这样的资源最好不要用来作为参数传来传去的,很容易忘记关闭,而且程序没有可读性。你应该把流中的数据读取出来再往下传。
    搂主现在的情况下应该在myfun中(f2后面关闭)关闭流。
      

  3.   

    如定义一个方法f(Instream in),此方法是别人实现。
    如规定在f中负责关闭in,那按下面方式调用
    Instream in=new FileInstream(new File("xxx"));
    f(in);
    在调用方法f后,就不能再使用in了。
    如规定在f中不负责关闭in,那就不能按下面方法调用了
    f(new FileInstream(new File("xxx")));也就是说现在定义的接口还和调用此接口的方式有关,这样是不是太不灵活了?
      

  4.   

    > 也就是说现在定义的接口还和调用此接口的方式有关,这样是不是太不灵活了?所谓“定义接口”应该包括“规定此接口的调用方式”吧?比如楼主的问题中,定义 f1() 的人应该说清楚,返回的那个 stream 是由 caller 负责关闭还是调用另一个跟 f1 一起提供的 method 来关闭;定义 f2() 的人应该说清楚,传进去的那个 stream 会不会在 f2 返回之前被关闭。
      

  5.   

    如象f(new FileInstream(new File("xxx")));这样的调用方式,只能在f中关闭instream了?
      

  6.   

    再举个具体的例子。
    jdom中向文件写入xml
    org.jdom.output.XMLOutputter xmlouter= new org.jdom.output.XMLOutputter();
    xmlouter.output(doc,new FileOutputStream("a.xml"));  ---1其中1处就不能这么写,是吗?