この質問は、finalize メソッドの例外および同様の質問の反対です。
AutoCloseable
適切に閉じないと重大なリスクをもたらすクラスを作成しています。そのような場合に、ユーザーがうっかり忘れないように、フェイル ハードを探しています。
一般的なベスト プラクティスは、Closeable
s が正常に失敗し、発信者のエラーを軽減するために最善を尽くすことですが、この場合、発信者はこれを見逃すことはありません。概念的にこの考えに同意しない場合は、フィードバックをいただければ幸いです。ただし、その場合、質問は Java の内部に関する学術的な演習と考えてください。
私が想像しているのは、クラスのメソッドが呼び出され、インスタンスがまだクリーンアップされていないIllegalStateException
場合に、ユーザーを発生させて中断することです。finalize()
ただしfinalize()
、キャッチされていない例外を明示的に飲み込むため、これはトリッキーになります。RuntimeException
メソッドからユーザーに表示されるようにする最善の方法は何finalize()
ですか?
ここに私がこれまでに得たもののデモクラスがあります:
public class SeriouslyCloseable implements AutoCloseable {
// We construct an Exception when the class is initialized, so that the stack
// trace informs where the class was created, rather than where it is finalized
private final IllegalStateException leftUnclosed = new IllegalStateException(
"SEVERE: "+getClass().getName()+" was not properly closed after use");
private boolean safelyClosed = false;
@Override
public void close() {
// do work
safelyClosed = true;
}
@Override
protected void finalize() throws IllegalStateException {
if(!safelyClosed) {
// This is suppressed by the GC
throw leftUnclosed;
}
}
}
注: また、finalize()
実行が保証されていないことも認識しているため、このメソッドの周りに実装することは絶対に行われるわけではありません。GCが機会を与えてくれるなら、私はまだそれが起こることを望んでいます.