JavaRush /مدونة جافا /Random-AR /جافا 7 جرب الموارد
DarthVictor
مستوى

جافا 7 جرب الموارد

نشرت في المجموعة
بدءًا من الإصدار 7، توفر Java إدارة محسنة للموارد التي يجب إغلاقها عند الانتهاء من العمل معها. وتشمل هذه الموارد، على سبيل المثال، الملفات والتدفقات واتصالات قاعدة البيانات والمآخذ. يتم خدمة هذا الغرض من خلال تجربة بناء لغة خاصة باستخدام الموارد. لكي يعمل هذا الإغلاق التلقائي، تم إنشاء واجهة خاصة AutoCloseable. تجربة جافا 7 مع الموارد - 1في 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، يمكنك تضمينها في ملف 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()لم تتمكن الطريقة من ذلك يفشل.
تعليقات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION