バージョン 7 以降、Java では、作業が終了したら閉じる必要があるリソースの管理が改善されました。このようなリソースには、ファイル、ストリーム、データベース接続、ソケットなどが含まれます。この目的は、特別な言語構造の try-with-resources によって実現されます。この自動クローズが機能するために、特別なインターフェイスが作成されています
AutoCloseable
。 Java 7 では、すべてのリソース クラスがこのインターフェイスを実装します。その署名は次のようになります。
public interface AutoCloseable {
void close() throws Exception;
}
close()
このインターフェイスは、コンストラクトによって提供されるオブジェクトに対して自動的に呼び出される メソッドを宣言しますtry-with-resources
。Java 7 のリソース クラスはこのインターフェイスを実装していますが、使用するライブラリの多くは実装していません。これは、ライブラリがAutoCloseableインターフェイスで動作するようにまだ更新されていないため、または単にライブラリを更新する機能がないためです。ほとんどの場合、これは簡単に解決できます。に参加するリソース クラスを継承しますtry-with-resources
。ITextRenderer
(空飛ぶ円盤プロジェクトから)例を見てみましょう。の作業が終了したらITextRenderer
、メソッドを呼び出す必要がありますfinishPDF()
。通常、これはブロック内で実行しますfinally
。ITextRenderer
ただし、インターフェイスを拡張して実装する新しいクラスを作成する場合はAutoCloseable
、それを .html ファイルに含めることができますtry-with-resources
。新しいクラスはAutoCloseableITextRenderer
次のようになります。
public class AutoCloseableITextRenderer extends ITextRenderer implements AutoCloseable {
@Override
public void close() {
super.finishPDF();
}
}
新しいクラスは依然として であるため、子孫内の元のクラスを拡張するのが最も合理的な解決策ですITextRenderer
。元のクラスが として宣言されている場合はfinal
、合成を使用する必要があります。使用方法は次のようになります。
try (final AutoCloseableITextRenderer iTextRenderer = new AutoCloseableITextRenderer()) {
ByteArrayOutputStream out; // contains the data to be converted to PDF, not shown here.
iTextRenderer.setDocumentFromString(new String(out.toByteArray()));
iTextRenderer.layout();
iTextRenderer.createPDF(pdfOutputStream);
pdfOutputStream.flush();
}
それだけです。close()
のメソッドから例外をスローしていないことに注意してくださいAutoCloseableITextRenderer
。インターフェイスの Javadoc にはAutoCloseable
、これについて次のように記載されています。 インターフェイス メソッドは例外をスローするように宣言されていますが、このメソッドの実装者は、メソッドを実装するときにより具体的な例外クラスを使用するか、メソッドが例外をスローできないException
場合は例外をまったくスローしないことを強くお勧めします。close()
失敗。
GO TO FULL VERSION