JavaRush /Java Blog /Random-TL /Java 7 try-with-resources

Java 7 try-with-resources

Nai-publish sa grupo
Simula sa bersyon 7, nag-aalok ang Java ng pinahusay na pamamahala ng mga mapagkukunan na dapat isara kapag natapos nang magtrabaho sa kanila. Kasama sa mga naturang mapagkukunan, halimbawa, ang mga file, stream, mga koneksyon sa database at mga socket. Ang layuning ito ay pinaglilingkuran ng isang espesyal na wika construct try-with-resources. Upang gumana ang awtomatikong pagsasara na ito, isang espesyal na interface ang ginawa AutoCloseable. Java 7 try-with-resources - 1Sa Java 7, lahat ng mga resource class ay nagpapatupad ng interface na ito. Ang pirma nito ay ganito:
public interface AutoCloseable {
    void close() throws Exception;
}
Ang interface ay nagdedeklara ng isang paraan close()na awtomatikong tinatawag sa mga bagay na inihatid ng construct try-with-resources. Kahit na ang mga resource class sa Java 7 ay nagpapatupad ng interface na ito, marami sa mga library na iyong ginagamit ay hindi, dahil ang library ay hindi pa naa-update upang gumana sa AutoCloseable na interface o wala ka lang ng pagkakataong i-update ang library. Sa karamihan ng mga kaso madali itong malutas. Magmana ng resource class na dapat lumahok sa try-with-resources. Kunin natin ang halimbawa ITextRenderer(mula sa proyektong Flying Saucer). Pagkatapos ng pagtatrabaho sa ITextRenderer, ang pamamaraan ay dapat na tinatawag finishPDF(). Karaniwang gagawin mo ito sa isang bloke finally. Ngunit kapag lumikha ka ng isang bagong klase na nagpapalawak ITextRendererat nagpapatupad ng interface AutoCloseable, maaari mo itong isama sa try-with-resources. Ang bagong klase AutoCloseableITextRendereray magiging ganito:
public class AutoCloseableITextRenderer extends ITextRenderer implements AutoCloseable {
    @Override
    public void close() {
        super.finishPDF();
    }
}
Ang pagpapalawak ng orihinal na klase sa isang inapo ay ang pinaka-makatwirang solusyon, dahil ang bagong klase ay magiging ITextRenderer. Kung sakaling ang orihinal na klase ay idineklara bilang final, dapat gamitin ang komposisyon. At ito ang magiging hitsura ng paggamit:
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();
        }
Iyon lang. Mangyaring tandaan na hindi ako nagtapon ng isang pagbubukod mula sa isang pamamaraan close()sa AutoCloseableITextRenderer. Ang Javadoc ng interface AutoCloseableay nagsasabi ng sumusunod tungkol dito: Bagama't ang paraan ng interface ay idineklara na magtapon ng mga eksepsiyon Exception, ang mga nagpapatupad ng pamamaraang ito ay lubos na inirerekomenda na gumamit ng mas tiyak na mga klase ng eksepsiyon kapag ipinapatupad ang pamamaraan, o hindi na magtapon ng mga eksepsiyon kung close()hindi ang pamamaraan mabibigo.
Mga komento
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION