با شروع نسخه 7، جاوا مدیریت بهبود یافته منابعی را ارائه می دهد که باید پس از پایان کار با آنها بسته شوند. چنین منابعی شامل فایلها، جریانها، اتصالات پایگاه داده و سوکتها هستند. این هدف توسط یک ساختار زبان ویژه try-with-resources انجام می شود. برای اینکه این بسته شدن خودکار کار کند، یک رابط ویژه ایجاد شده است
AutoCloseable
. در جاوا 7، تمام کلاس های منبع این رابط را پیاده سازی می کنند. امضای آن به این صورت است:
public interface AutoCloseable {
void close() throws Exception;
}
اینترفیس متدی را اعلام می کند close()
که به طور خودکار بر روی اشیاء ارائه شده توسط ساختار فراخوانی می شود try-with-resources
. اگرچه کلاسهای منبع در جاوا 7 این رابط را پیادهسازی میکنند، اما بسیاری از کتابخانههایی که استفاده میکنید این کار را انجام نمیدهند، یا به این دلیل که کتابخانه هنوز برای کار با رابط AutoCloseable به روز نشده است یا به سادگی توانایی بهروزرسانی کتابخانه را ندارید. در بیشتر موارد این را می توان به راحتی حل کرد. کلاس منبعی را که باید در آن شرکت کند به ارث می برد try-with-resources
. ITextRenderer
به عنوان مثال (از پروژه Flying Saucer) را در نظر می گیریم . پس از اتمام کار با ITextRenderer
متد باید فراخوانی شود finishPDF()
. به طور معمول شما این کار را در یک بلوک انجام می دهید finally
. اما وقتی یک کلاس جدید ایجاد میکنید که ITextRenderer
رابط را گسترش میدهد و پیادهسازی میکند AutoCloseable
، میتوانید آن را در آن قرار دهید 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