6

AutoCloseable を実装するクラスがあり、Java 7 の新しい try-with-resources コンストラクトで使用することを目的としています。ただし、私のクラスのユーザーが try-with-resources を使用することを保証する方法がわかりません。これが起こらなければ、私のクラスはそれ自体を閉じることができず、悪いことが起こります. これを強制する方法はありますか - 言語構造またはそれ以外 - try-with-resources ブロックにいるかどうかを検出して、そうでない場合は例外をスローできるようにすることもできます (コンパイル時の構成が望ましいですが)。

ありがとう!

4

3 に答える 3

3

残念ながら、ユーザーの愚かさから身を守る方法はありません。

finalize呼び出すメソッドを実装できますclose。このようにして、少なくともオブジェクトがガベージ コレクションされるときにリソースが閉じられていることを確認できます。

プロジェクトの使用方法に制限を設けることができれば、アスペクト指向プログラミングを使用していくつかのポリシーを適用できるかもしれませんが、Java を実際に使用することはなくなります。

于 2013-07-02T16:12:37.240 に答える
1

リソース管理に本当に関心がある場合は、コールバック イディオムを使用するのが最も安全な方法です。コレクションを公開するのではなく、エンドユーザーがコレクション内のアイテムを処理できるようにする API を公開します。

public interface Callback<T> {
  void handle(T item);
}

public class SuperVitalVault {
  public void all(Callback<Precious> callback) {
    try (...) {
      for (Precious i : ...) {
        callback.handle(i);
      }
    }
  }
}

早期終了をサポートする場合はCallback.handle(T)、 a を返すように変更できます。boolean

    try (...) {
      for (Precious i : ...) {
        if (callback.handle(i)) break;
      }
    }

Function<T, Boolean>独自のコールバック インターフェイスを定義しない場合は、Guava のorを使用できますが、Predicate<T>Guava によって確立されたセマンティクスに違反することに注意してください。

Function のインスタンスは一般に、参照透過性 (副作用なし) であり、equals と一貫性があることが期待されます。つまり、a.equals(b) は function.apply(a).equals(function.apply(b) を意味します)。

Predicate のインスタンスは一般に、副作用がなく、equals と一貫性があると予想されます。

于 2013-12-31T22:26:23.947 に答える
-1

いいえ、方法はありません。ファイルまたはデータベース接続を開き続け、それらを閉じないと、同じ悪いことが起こります...

適切なリソースを 1 つのメソッド呼び出しの範囲内で使用および破棄できる場合は、API が呼び出されるたびに開閉できます。そうでない場合は、動作を十分に文書化するだけです。

あなたのクラスはシャットダウンフックも登録するかもしれないので、少なくともjvmがダウンしたときにリソースを閉じることができますが、とにかくこれはライブラリの悪い習慣だと思います。

于 2013-07-02T16:12:38.660 に答える