Dimulai dengan versi 7, Java menawarkan peningkatan pengelolaan sumber daya yang harus ditutup setelah selesai bekerja dengannya. Sumber daya tersebut mencakup, misalnya, file, aliran, koneksi database, dan soket. Tujuan ini dilayani oleh konstruksi bahasa khusus try-with-resources. Agar penutupan otomatis ini dapat berfungsi, antarmuka khusus telah dibuat
AutoCloseable
. Di Java 7, semua kelas sumber daya mengimplementasikan antarmuka ini. Tanda tangannya terlihat seperti ini:
public interface AutoCloseable {
void close() throws Exception;
}
Antarmuka mendeklarasikan metode close()
yang secara otomatis dipanggil pada objek yang dilayani oleh konstruk try-with-resources
. Meskipun kelas sumber daya di Java 7 mengimplementasikan antarmuka ini, banyak perpustakaan yang Anda gunakan tidak menerapkannya, baik karena perpustakaan belum diperbarui untuk bekerja dengan antarmuka AutoCloseable atau Anda tidak memiliki kemampuan untuk memperbarui perpustakaan. Dalam kebanyakan kasus, hal ini dapat diselesaikan dengan mudah. Mewarisi kelas sumber daya yang harus berpartisipasi dalam try-with-resources
. Mari kita ambil contoh ITextRenderer
(dari proyek Piring Terbang). Setelah selesai bekerja ITextRenderer
, metode tersebut harus dipanggil finishPDF()
. Biasanya Anda akan melakukan ini dalam satu blok finally
. Namun saat Anda membuat kelas baru yang memperluas ITextRenderer
dan mengimplementasikan antarmuka AutoCloseable
, Anda dapat memasukkannya ke dalam kelas try-with-resources
. Kelas baru AutoCloseableITextRenderer
akan terlihat seperti ini:
public class AutoCloseableITextRenderer extends ITextRenderer implements AutoCloseable {
@Override
public void close() {
super.finishPDF();
}
}
Memperluas kelas asli secara turunan adalah solusi paling masuk akal, karena kelas baru akan tetap ITextRenderer
. Jika kelas asli dideklarasikan sebagai final
, komposisi harus digunakan. Dan seperti inilah tampilan penggunaannya:
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();
}
Itu saja. Harap dicatat bahwa saya tidak memberikan pengecualian dari suatu metode close()
di file AutoCloseableITextRenderer
. Javadoc antarmuka AutoCloseable
mengatakan hal berikut tentang hal ini: Meskipun metode antarmuka dinyatakan membuang pengecualian Exception
, pelaksana metode ini sangat disarankan untuk menggunakan kelas pengecualian yang lebih spesifik saat mengimplementasikan metode, atau tidak membuang pengecualian sama sekali jika metode close()
tidak dapat gagal.
GO TO FULL VERSION