Java 8 Streamインスタンスは常にclose() 'dすべきですか?


12

quothがJavadocを

ストリームにはBaseStream.close()メソッドがあり、AutoCloseableを実装していますが、ほとんどすべてのストリームインスタンスを実際に使用後に閉じる必要はありません。通常、ソースがIOチャネル(Files.lines(Path、Charset)によって返されるものなど)であるストリームのみを閉じる必要があります。ほとんどのストリームは、特別なリソース管理を必要としないコレクション、配列、または生成関数によって支援されます。(ストリームを閉じる必要がある場合、try-with-resourcesステートメントでリソースとして宣言できます。)

「ほぼすべて」と「一般に」はあいまいです-ライブラリを作成していて、そのストリームのユーザーからストリームのソースを抽象化している場合は、とにかく自分に質問する必要があります-「閉じる必要がありますこの?" 端末操作はを呼び出さないため、IOがサポートするストリームを閉じる必要がありますclose。そのため、事実上、ストリームの送信元を常に覚えておくか、常にストリームする必要がありますclose

核となる選択肢は、メソッドからストリームを返さないか、ストリームパラメーターを受け入れないことです。これは、JDKチームの一部の人々によって反響されてきた感情です。Streamsの実用的な有用性を考えると、過度に制限されていることがわかります。

Streamsを閉じる際のベストプラクティスは何ですか?よく似たコミュニティの質問に通常積極的に参加しているJDKの人々から、これに対する答えをオンラインで探しましたが、関連するものは見つかりませんでした。


Java開発者ではありませんが、これらのルールを使用します。-ストリームが引数として渡される場合、呼び出し元が必要に応じてストリームを閉じる必要があることを文書化します。-関数からストリームが返された場合、それを閉じる必要があると仮定します。
バートヴァンインゲンシェナウ

回答:


6

先ほど述べたように、Javaでは、誰がどのリソースを解放する責任があるかを正確に知る必要があるため、適切なtry-catch-constructs、try-with-resourcesを入力するか、何らかの方法でそのタスクを委任できます。

GCに依存してクリーンアップできる唯一のものは、100%純粋なメモリです。他のリソースが混在している可能性がある
場合、合理的にできるのは、単に安全にプレイすることだけです。


だから基本的closeに唯一の安全な代替手段ですか?質問は、Streamを使用すると便利になるたびに、コードを過度に見苦しくしないようにする方法だと思います。
-RuslanD

1
はい、メモリ以外のリソースがある可能性がある場合、唯一安全なことは、があると仮定することです。JavaはGC以外のリソースには非常に不向きですが、それを回避する方法はありません。
デュプリケータ

それで、それが2つのコレクションの間のストリーム(純粋なメモリ)である場合、それを閉じる必要はありませんか?
アマルゴビヌス

@アマルゴビナス正解
ブラッド・クピット

5

「ベストプラクティス」に関する限り、「リソースストリーム」を返すメソッドには命名規則を使用することをお勧めします。

ストリームをclose()編集する必要がある場合は、ファクトリメソッドopen()またはを呼び出しますopenStream()stream()SDKによって確立された規則に従って、一時ストリームを構築するメソッドを呼び出します。メソッドにjavadocを常に配置して、クライアントに必要close()であることを警告します。

public interface StreamingServer<RECORD> {
    /** 
     * Return a memory-efficient record stream from {@code source}.
     * Clients <em>must</em> call {@link Stream#close} to dispose the
     * stream.
     */
    Stream<RECORD> openStream(URI source) throws IOException;
}

SDKの作成者がAutoCloseable基本ストリームクラスを使用することを選択していなかったことを願っています。ResourceStream簡単に実装する別個のサブタイプAutoCloseableは、異なるコントラクトを明らかにします。次に、それをStream必要としないを閉じることができずResourceStream、静的分析ツールで潜在的に誤った管理を検出することができます。

コードベースのニーズ(およびコードレビューで規則を実施する能力)に応じて、必要なストリームサブクラスを自分で確立できます。または、独自の静的分析ツール、管理対象リソースを直接マークするメソッドアノテーションを作成する場合。

@RequiresClose
Stream<RECORD> openStream(URI source) throws IOException { ... }
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.