JavaRush /Blog Java /Random-MS /Java 7 cuba-dengan-sumber

Java 7 cuba-dengan-sumber

Diterbitkan dalam kumpulan
Bermula dengan versi 7, Java menawarkan pengurusan sumber yang lebih baik yang harus ditutup selepas selesai bekerja dengannya. Sumber tersebut termasuk, sebagai contoh, fail, aliran, sambungan pangkalan data dan soket. Tujuan ini disediakan oleh konstruk bahasa khas cuba-dengan-sumber. Agar penutupan automatik ini berfungsi, antara muka khas telah dibuat AutoCloseable. Java 7 cuba-dengan-sumber - 1Dalam Java 7, semua kelas sumber melaksanakan antara muka ini. Tandatangannya kelihatan seperti ini:
public interface AutoCloseable {
    void close() throws Exception;
}
Antara muka mengisytiharkan kaedah close()yang dipanggil secara automatik pada objek yang disampaikan oleh konstruk try-with-resources. Walaupun kelas sumber dalam Java 7 melaksanakan antara muka ini, kebanyakan perpustakaan yang anda gunakan tidak melakukannya, kerana perpustakaan belum dikemas kini untuk berfungsi dengan antara muka AutoCloseable atau anda tidak mempunyai peluang untuk mengemas kini perpustakaan. Dalam kebanyakan kes ini boleh diselesaikan dengan mudah. Warisi kelas sumber yang sepatutnya mengambil bahagian dalam try-with-resources. Mari kita ambil contoh ITextRenderer(dari projek Piring Terbang). Selepas selesai bekerja dengan ITextRenderer, kaedah harus dipanggil finishPDF(). Biasanya anda akan melakukan ini dalam satu blok finally. Tetapi apabila anda mencipta kelas baharu yang memanjangkan ITextRendererdan melaksanakan antara muka AutoCloseable, anda boleh memasukkannya ke dalam try-with-resources. Kelas baharu AutoCloseableITextRendererakan kelihatan seperti ini:
public class AutoCloseableITextRenderer extends ITextRenderer implements AutoCloseable {
    @Override
    public void close() {
        super.finishPDF();
    }
}
Memperluaskan kelas asal dalam keturunan ialah penyelesaian yang paling munasabah, kerana kelas baharu akan tetap ITextRenderer. Sekiranya kelas asal diisytiharkan sebagai final, komposisi mesti digunakan. Dan inilah yang kelihatan seperti penggunaan:
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();
        }
Itu sahaja. Sila ambil perhatian bahawa saya tidak membuang pengecualian daripada kaedah close()dalam AutoCloseableITextRenderer. Javadoc bagi antara muka AutoCloseablemenyatakan perkara berikut tentang perkara ini: Walaupun kaedah antara muka diisytiharkan sebagai membuang pengecualian Exception, pelaksana kaedah ini amat disyorkan untuk menggunakan kelas pengecualian yang lebih khusus apabila melaksanakan kaedah, atau tidak membuang pengecualian sama sekali jika kaedah itu close()tidak dapat gagal.
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION