JavaRush /وبلاگ جاوا /Random-FA /Java 7 try-with-resources
DarthVictor
مرحله

Java 7 try-with-resources

در گروه منتشر شد
با شروع نسخه 7، جاوا مدیریت بهبود یافته منابعی را ارائه می دهد که باید پس از پایان کار با آنها بسته شوند. چنین منابعی شامل فایل‌ها، جریان‌ها، اتصالات پایگاه داده و سوکت‌ها هستند. این هدف توسط یک ساختار زبان ویژه try-with-resources انجام می شود. برای اینکه این بسته شدن خودکار کار کند، یک رابط ویژه ایجاد شده است AutoCloseable. Java 7 try-with-resources - 1در جاوا 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()شکست.
نظرات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION