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