リソース管理に本当に関心がある場合は、コールバック・イディオムを使用するのが最も安全な方法です。
:あなたは早期終了をサポートする場合
public interface Callback<T> {
void handle(T item);
}
public class SuperVitalVault {
public void all(Callback<Precious> callback) {
try (...) {
for (Precious i : ...) {
callback.handle(i);
}
}
}
}
あなたはboolean
を返すようにCallback.handle(T)
を変更することができます:あなたは、エンドユーザーがコレクション内の項目を処理することを可能にするコレクションが、APIを公開していません。
try (...) {
for (Precious i : ...) {
if (callback.handle(i)) break;
}
}
あなたは離れて独自のコールバックインタフェースを定義するから滞在したい場合は、グアバのFunction<T, Boolean>
やPredicate<T>
を使用しますが、それはグアバによって確立されたセマンティクスに違反することに注意することができます
Functionのインスタンスは、一般的には、副作用がなく、明示的にトランスペアレントであることが期待されます。つまり、a.equals(b)は、function.apply(a).equals(function.apply b))。
プレディケートのインスタンスは、通常、副作用がなく、同等に一致すると予想されます。
try-with-resourcesを使用して自動的にではなく、クラスを手動で 'close'する方法を教えてください。 'close'と呼ばれる' finalize'メソッドを作成して問題を解決するでしょうか? – Jeffrey
残念ながら、 'finalize'は呼び出される保証はありません。 GCはそれを呼び出さないことを決定するかもしれない。 – joshlf
実際、「ファイナライズ」の信頼性がないのはおそらくリソースの試行が導入された理由だと思います。 – joshlf