7-versiyadan boshlab Java resurslarni boshqarishni takomillashtiradi, ular bilan ishlash tugagach yopilishi kerak. Bunday resurslarga, masalan, fayllar, oqimlar, ma'lumotlar bazasi ulanishlari va rozetkalar kiradi. Bu maqsadga "Resurslar bilan sinab ko'ring" maxsus til konstruktsiyasi xizmat qiladi. Ushbu avtomatik yopilish ishlashi uchun maxsus interfeys yaratilgan
AutoCloseable
. Java 7 da barcha resurs sinflari ushbu interfeysni amalga oshiradi. Uning imzosi quyidagicha ko'rinadi:
public interface AutoCloseable {
void close() throws Exception;
}
Interfeys close()
konstruksiya tomonidan xizmat ko'rsatadigan ob'ektlarda avtomatik ravishda chaqiriladigan usulni e'lon qiladi try-with-resources
. Java 7-dagi resurs sinflari ushbu interfeysni amalga oshirsa-da, siz foydalanadigan ko'pgina kutubxonalar yo'q, chunki kutubxona hali Avtomatik yopiladigan interfeys bilan ishlash uchun yangilanmagan yoki siz kutubxonani yangilash imkoniga ega emassiz. Aksariyat hollarda bu muammoni osongina hal qilish mumkin. da ishtirok etishi kerak bo'lgan resurs sinfini meros qilib oling try-with-resources
. ITextRenderer
Misol uchun (Uchar likopcha loyihasidan) olaylik . U bilan ishlashni tugatgandan so'ng ITextRenderer
, usul chaqirilishi kerak finishPDF()
. Odatda siz buni blokda qilasiz finally
. ITextRenderer
Lekin interfeysni kengaytiruvchi va amalga oshiradigan yangi sinf yaratganingizda AutoCloseable
, uni try-with-resources
. Yangi sinf AutoCloseableITextRenderer
quyidagicha ko'rinadi:
public class AutoCloseableITextRenderer extends ITextRenderer implements AutoCloseable {
@Override
public void close() {
super.finishPDF();
}
}
Asl sinfni avlodda kengaytirish eng oqilona yechimdir, chunki yangi sinf hali ham bo'ladi ITextRenderer
. Agar asl sinf sifatida e'lon qilingan bo'lsa final
, kompozitsiyadan foydalanish kerak. Va foydalanish quyidagicha ko'rinadi:
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();
}
Ana xolos. close()
Iltimos, esda tutingki, men usulidan istisno qilmadim AutoCloseableITextRenderer
. Interfeysning Javadoc dasturi AutoCloseable
bu haqda quyidagilarni aytadi: Garchi interfeys usuli istisnolarni tashlash uchun e'lon qilingan bo'lsa-da Exception
, ushbu usulni amalga oshiruvchilarga usulni amalga oshirishda aniqroq istisno sinflaridan foydalanish tavsiya etiladi yoki agar usul buni amalga close()
oshira olmasa , istisnolarni umuman tashlamaslik tavsiya etiladi. muvaffaqiyatsiz.
GO TO FULL VERSION