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