私は、ファイルへのInputStreamを開き、レガシーコードで働いていると、ストリームが適切に閉じられている場合、私は興味があります。私たちが現在持っていることのInputStreamは、後でそれを閉じて別のメソッドによって呼び出さ返すメソッドです。
public void doThing(String path) throws Exception {
InputStream is = getStream(path);
try {
... // Do some stuff
} finally {
if(is != null)
is.close();
}
}
public InputStream getStream(String path) throws Exception {
InputStream is = new FileInputStream(new File(path));
... // Do some stuff
return is;
}
呼び出しがする場合しかし、私は確かではないよdoThing()
適切InputStreamのすべてのインスタンスを閉じますis
。私は内と理解doThing()
方法、InputStreamのインスタンスが返されるgetStream()
と、適切によって閉鎖されているfinally
ブロック。その部分は明らかです。
私は何をするかどうか分からないことはあるか否かを判別getStream()
する方法スポーン適切に閉じられていないのInputStreamの新しいインスタンス。
すなわちときに、getStream()
戻り、それが戻っている参照元のオブジェクトへのis
、またはそれが戻っている新しいインスタンスのis
同じ値を持ちますか?
それはかつてのなら、私は確信していdoThing()
メソッドは、すべてのファイルへのストリームを閉じているでしょう。それは後者しかしだ場合、私は私が明示的に閉じられることはありません別のストリームを作成している場合があり心配です。代わりに、オブジェクトは、ちょうどまたは最終的にそれを取り除くしない場合がありガベージコレクタによって削除対象としてマークされるだろう。私はそれを避けるためにしたいと思います。
すべてのインスタンスであるis
の終わりに閉じられましたのdoThing()
?
新しいインスタンスは唯一で...作成されますnew
(*)。あなたが表示されない場合new
があり、作成中の新しいインスタンスがありません。
だから、新しいインスタンスがリターンによって作成されません。提供は何もそれがで「やるいくつかのもの」で例外をスロー起こりませんgetStream
、あなたはおそらく、適切な方法でこれを閉じています。
より良い方法は、try--リソースを持つ例外を保存するより徹底した仕事をして、使用します。
(*)[OK]を、はい、これは、例えば、文字列の連結のために、非常に真実ではない、いくつかの特定のケースがあります。文字列の連結およびオートボクシング。文字列の連結、オートボクシングおよび配列宣言。私は再び来るだろう。
しかし実際には、の欠如はnew
糖衣構文は次のとおりです。どこかで、new
呼び出されています。