Java - Coba dengan Resources

1. Ikhtisar

Dukungan untuk try-with-resources - diperkenalkan di Java 7 - memungkinkan kita untuk mendeklarasikan resource yang akan digunakan dalam blok percobaan dengan jaminan bahwa resource akan ditutup setelah eksekusi blok tersebut.

Sumber daya yang dideklarasikan harus menerapkan antarmuka AutoCloseable .

2. Menggunakan try-with-resources

Sederhananya, untuk ditutup otomatis, sumber daya harus dideklarasikan dan diinisialisasi dalam percobaan , seperti yang ditunjukkan di bawah ini:

try (PrintWriter writer = new PrintWriter(new File("test.txt"))) { writer.println("Hello World"); } 

3. Mengganti percobaan - tangkap-akhirnya Dengan percobaan-dengan-sumber daya

Cara sederhana dan jelas untuk menggunakan fungsionalitas coba-dengan-sumber daya yang baru adalah dengan mengganti blok coba-tangkap-akhirnya yang tradisional dan verbose .

Mari kita bandingkan contoh kode berikut - pertama adalah blok coba-tangkap-akhirnya , lalu pendekatan baru, menggunakan blok coba-dengan-sumber daya yang setara:

Scanner scanner = null; try { scanner = new Scanner(new File("test.txt")); while (scanner.hasNext()) { System.out.println(scanner.nextLine()); } } catch (FileNotFoundException e) { e.printStackTrace(); } finally { if (scanner != null) { scanner.close(); } }

Dan inilah solusi super ringkas menggunakan try-with-resources:

try (Scanner scanner = new Scanner(new File("test.txt"))) { while (scanner.hasNext()) { System.out.println(scanner.nextLine()); } } catch (FileNotFoundException fnfe) { fnfe.printStackTrace(); }

Di sinilah Anda dapat mempelajari lebih lanjut kelas Scanner .

4. mencoba-dengan-sumber daya Dengan Banyak Sumber Daya

Beberapa sumber daya dapat dideklarasikan dengan baik dalam blok coba-dengan-sumber daya dengan memisahkannya dengan titik koma:

try (Scanner scanner = new Scanner(new File("testRead.txt")); PrintWriter writer = new PrintWriter(new File("testWrite.txt"))) { while (scanner.hasNext()) { writer.print(scanner.nextLine()); } }

5. Sumber Daya Kustom Dengan AutoCloseable

Untuk membangun sumber daya kustom yang akan benar ditangani oleh try-dengan-sumber blok, kelas harus menerapkan dapat ditutup atau AutoCloseable interface, dan menimpa dekat metode:

public class MyResource implements AutoCloseable { @Override public void close() throws Exception { System.out.println("Closed MyResource"); } }

6. Perintah Penutupan Sumber Daya

Sumber daya yang ditentukan / diperoleh pertama kali akan ditutup terakhir; mari kita lihat contoh perilaku ini:

Sumber daya 1:

public class AutoCloseableResourcesFirst implements AutoCloseable { public AutoCloseableResourcesFirst() { System.out.println("Constructor -> AutoCloseableResources_First"); } public void doSomething() { System.out.println("Something -> AutoCloseableResources_First"); } @Override public void close() throws Exception { System.out.println("Closed AutoCloseableResources_First"); } } 

Sumber daya 2:

public class AutoCloseableResourcesSecond implements AutoCloseable { public AutoCloseableResourcesSecond() { System.out.println("Constructor -> AutoCloseableResources_Second"); } public void doSomething() { System.out.println("Something -> AutoCloseableResources_Second"); } @Override public void close() throws Exception { System.out.println("Closed AutoCloseableResources_Second"); } }

Kode:

private void orderOfClosingResources() throws Exception { try (AutoCloseableResourcesFirst af = new AutoCloseableResourcesFirst(); AutoCloseableResourcesSecond as = new AutoCloseableResourcesSecond()) { af.doSomething(); as.doSomething(); } } 

Keluaran:

Pembuat -> AutoCloseableResources_First

Pembuat -> AutoCloseableResources_Second

Sesuatu -> AutoCloseableResources_First

Sesuatu -> AutoCloseableResources_Second

Tutup AutoCloseableResources_Second

Tutup AutoCloseableResources_First

7. menangkap & akhirnya

Sebuah coba-dengan-sumber blok masih dapat memiliki menangkap dan akhirnya blok - yang akan bekerja dengan cara yang sama seperti dengan tradisional try blok.

8. Java 9: ​​Final EfektifVariabel

Sebelum Java 9, kita hanya dapat menggunakan variabel baru di dalam blok try-with-resources :

try (Scanner scanner = new Scanner(new File("testRead.txt")); PrintWriter writer = new PrintWriter(new File("testWrite.txt"))) { // omitted }

Seperti yang ditunjukkan di atas, ini sangat bertele-tele saat mendeklarasikan banyak sumber daya. Pada Java 9 dan sebagai bagian dari JEP 213, kita sekarang dapat menggunakan variabel final atau bahkan variabel final secara efektif di dalam blok try-with-resources :

final Scanner scanner = new Scanner(new File("testRead.txt")); PrintWriter writer = new PrintWriter(new File("testWrite.txt")) try (scanner;writer) { // omitted }

Sederhananya, variabel secara efektif final jika tidak berubah setelah tugas pertama, meskipun tidak secara eksplisit ditandai sebagai final .

Seperti yang ditunjukkan di atas, variabel pemindai dinyatakan final secara eksplisit, sehingga kita dapat menggunakannya dengan blok try-with-resources . Meskipun variabel penulis tidak final secara eksplisit , itu tidak berubah setelah tugas pertama. Oleh karena itu, kami juga diizinkan untuk menggunakan variabel penulis .

9. Kesimpulan

Pada artikel ini, kita telah membahas bagaimana menggunakan try-with-resources, bagaimana mengganti try , catch , dan terakhir dengan try-with-resources, membangun sumber daya kustom dengan AutoCloseable dan mengurutkan sumber daya yang ditutup.

Kode sumber lengkap untuk contoh tersedia di proyek GitHub ini.