JavaRush /จาวาบล็อก /Random-TH /Java 7 ลองใช้ทรัพยากร
DarthVictor
ระดับ

Java 7 ลองใช้ทรัพยากร

เผยแพร่ในกลุ่ม
ตั้งแต่เวอร์ชัน 7 เป็นต้นไป Java เสนอการจัดการทรัพยากรที่ได้รับการปรับปรุงซึ่งควรปิดเมื่อทำงานกับทรัพยากรเหล่านั้นเสร็จแล้ว ทรัพยากรดังกล่าวได้แก่ ไฟล์ สตรีม การเชื่อมต่อฐานข้อมูล และซ็อกเก็ต วัตถุประสงค์นี้ให้บริการโดยโครงสร้างภาษาพิเศษ try-with-resources เพื่อให้การปิดอัตโนมัตินี้ทำงานได้ จึงมีการสร้างอินเทอร์เฟซพิเศษขึ้นAutoCloseableมา Java 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