2016-05-30 6 views
-1

私は、閉じなければならないリソースを割り当てたJavaクラスを持っています。私の現在のアプローチは、AutoCloseableインターフェイスを実装していて、呼び出し側がclose()を呼び出し、すべてのメソッドのbeginでチェックされたbooleanを追加することを期待しています。をスローすると、trueがスローされます。resouresを閉じるにはどうすればよいですか?

両方とも、呼び出し側がclose()を呼び出す必要があり、すべてのメソッドの冒頭で閉じていることを確認する必要がありますが、これは避けるためのベストプラクティスですか?

+0

あなたの質問は明確ではありません。明確にしてコードスニペットを共有してください。あなたの問題を理解するのに役立ちます –

+1

"期待しています"クラスを文書化するだけで、基本的に「このクラスを閉じないと、動作は未定義です。ジョブが完了しました。 – fge

+0

私が考えることができる唯一のベストプラクティスは、「あなたがしていることを確認する」ことです。あなたのコードを使用している誰かがそれをしない場合、まあ、それは彼らの問題です。私が追加する唯一のもう一つのことは、「あなたが開いたリソースを閉じてください」です。 –

答えて

2

AutoCloseableクラスは、try-with-resourceステートメントで使用できるように、あなたのケースでは良いアプローチです。

何らかの理由であなたは適切にリークを避けるために閉じて、あなたに次のfinalize方法オーバーライドすることができない、あなたのオブジェクトのインスタンスを持つことの危険性を制限したい場合:

@Override 
protected void finalize() throws Throwable { 
    try { 
     this.close(); 
    } finally { 
     super.finalize(); 
    } 
} 

警告1:の実装をfinalizeメソッドは、GCの処理速度を遅くするので、実行するコードが高速になるようにする必要があるため、多くの注意が必要です。

警告2:finalizeメソッドは必要ありませんので、あなたのためにオブジェクトをcloseするためにそれに依存しないと呼ばれるが、それだけのリスクを減らすのに役立ち、あなたのオブジェクトのユーザーがまだcloseに責任を持って適切に。

+1

ファイナライザのメソッドは*常に*呼び出される保証はありませんので、リソースを本当に*常に*クローズする必要がある場合、これは100%の解決策ではありません。 – Jesper

+0

私の答えは、*これをJavaで*強制するのは良い方法ではありません。クラスのユーザーの責任で 'close()'メソッドを呼び出すことです。私は 'AutoCloseable'を実装することをお勧めします。これは、ユーザに少なくともclose()を呼び出さなければならないというヒントを与えるはずです。 – Jesper

+0

@ジャスパー警告を追加するために私の答えを更新しました。再度確認してください –

関連する問題