2017-02-27 22 views
3

自分自身を他のオブジェクトにリスナーとして登録するオブジェクトを記述する必要があることがあります。 プログラミングの慣習として、そうしたリスナーの登録を常に解除する必要があると言われています。 クラスにCloseableを実装させ、リスナーの登録をclose()に登録解除することによって、このような動作を強制することをお勧めしますか?Java:Closeable.close()のリスナーを登録解除する

Closeableは、主にOSリソース(ファイルなど)を閉じることを主な目的としていましたが、リスナーのケースがCloseableの責任の範囲外になるかどうかはわかりません。

+0

これは、リスナーが自身を登録解除する方法を知っていて、登録されているすべての場所を把握することを意味します。 –

答えて

1

ここではいくつかのレベルの意見がありますが、documentationとメソッドcloseの名前に基づいて、別の方法を作成して(unregisterと呼んでいます)。その理由は、コードを可能な限り自明にしたいからです。

またclose()自体にドキュメントを注意してください。

はこのストリームを解放、それに関連するすべてのシステムリソースを閉じます。ストリームがすでに閉じられている場合、このメソッドを呼び出すことは効果がありません。

説明したコードに基づいて、そのようなストリームまたはシステムリソースはありません。

EDIT:あなたはCloseable溶液で行きたい場合には

ところで、それは良い方法は、それはあなたがしよう - と、リソースのコードで使用することができるようになるので、代わりにAutoCloseableを実装することである、と思われますこれらのリスナーを使用します。 AutoCloseableのドキュメントでは、以下のものが挙げている:

API注:

基底クラスがAutoCloseableを実装することは、一般的な可能であり、実際にもかかわらず、ではないそのサブクラスのすべてインスタンスが解放可能なリソースを保持します。完全な一般性で動作する必要のあるコード、またはAutoCloseableインスタンスがリソースの解放を必要とすることがわかっている場合は、try-with-resources構造を使用することをお勧めします。ただし、I/Oベースのフォームと非I/Oベースのフォームの両方をサポートするStreamなどのファシリティを使用する場合、I/Oベースではないフォームを使用すると、try-with-resourcesブロックは一般的に不要です。

このノートでは、その実装が実際のリソースを使用しない場合でも、クラスAutoCloseableを実装することができることを意味します。ただし、実際のリソースを使用するサブクラス(少なくとも1つのタイプのリスナー)が少なくとも1つ存在する必要があることも示唆しています。これは、Stream APIの場合です。

+0

私は同意しますが、なぜ別のインターフェースを作成する必要がありますか? Javaの平均的な開発者はCloseableについて知っており、クローズ可能なオブジェクトを扱うときにどのように行動するかを知っています。 別のインターフェースまたは 'unregister()'メソッドを作成するだけで、APIが複雑になります。 –

+0

@MarcoRomano私は答えを少し広げました。リスナーのサブクラスのいずれもリソースを使用しない場合、私は依然としてそれらのための別個のインターフェースを作成します。私はまだ存在するものを再利用することの可読性に賛成ですが、私の場合にはまったく当てはまりません。 – manouti

関連する問題