Java - Cuba dengan Sumber

1. Gambaran keseluruhan

Sokongan untuk mencuba dengan sumber - diperkenalkan di Java 7 - memungkinkan kita untuk menyatakan sumber yang akan digunakan dalam blok percubaan dengan jaminan bahawa sumber daya akan ditutup ketika setelah pelaksanaan blok tersebut.

Sumber yang dinyatakan mesti melaksanakan antara muka AutoCloseable .

2. Menggunakan sumber daya mencuba

Sederhananya, untuk ditutup secara automatik, sumber mesti dinyatakan dan diinisialisasi dalam percubaan , seperti yang ditunjukkan di bawah:

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

3. Menggantikan try - catch-akhirnya Dengan try-with-resources

Kaedah yang mudah dan jelas untuk menggunakan fungsi try-with-resources yang baru adalah dengan menggantikan blok try-catch-akhirnya tradisional dan verbose .

Mari bandingkan contoh kod berikut - pertama adalah blok khas cubaan-tangkapan-akhirnya , kemudian pendekatan baru, menggunakan blok cuba-dengan-sumber 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 penyelesaian yang ringkas menggunakan sumber daya percubaan:

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 meneroka kelas Pengimbas dengan lebih jauh .

4. cuba-dengan-sumber dengan pelbagai sumber

Pelbagai sumber boleh dinyatakan baik-baik saja dalam blok cubaan dengan sumber 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 Khusus Dengan AutoCloseable

Untuk membina sumber adat yang akan betul dikendalikan oleh cuba-dengan-sumber blok, kelas perlu melaksanakan Closeable atau AutoCloseable antara muka, dan mengatasi berhampiran kaedah:

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

6. Perintah Penutup Sumber

Sumber yang ditentukan / diperoleh pertama akan ditutup terakhir; mari kita lihat contoh tingkah laku ini:

Sumber 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 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"); } }

Kod:

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

Pengeluaran:

Pembina -> AutoCloseableResources_First

Pembina -> AutoCloseableResources_Second

Sesuatu -> AutoCloseableResources_First

Sesuatu -> AutoCloseableResources_Second

AutoCloseableResources_Second Tertutup

AutoCloseableResources_First yang ditutup

7. tangkapan & akhirnya

A cuba-dengan-sumber blok masih boleh mempunyai tangkapan dan akhirnya blok - yang akan bekerja dengan cara yang sama seperti dengan tradisional cuba blok.

8. Java 9: ​​Akhir BerkesanPemboleh ubah

Sebelum Java 9, kami hanya dapat menggunakan pemboleh ubah baru di dalam blok cubaan dengan sumber :

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 verbose ketika menyatakan pelbagai sumber. Seperti Java 9 dan sebagai sebahagian dari JEP 213, kita sekarang boleh menggunakan pemboleh ubah akhir atau bahkan berkesan dalam blok cubaan dengan sumber :

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

Ringkasnya, pemboleh ubah secara efektif adalah muktamad jika tidak berubah setelah tugasan pertama, walaupun tidak secara jelas ditandai sebagai akhir .

Seperti yang ditunjukkan di atas, pemboleh ubah pengimbas dinyatakan akhir secara eksplisit, jadi kami dapat menggunakannya dengan blok cubaan dengan sumber . Walaupun pemboleh ubah penulis tidak final secara eksplisit , ia tidak berubah selepas tugasan pertama. Oleh itu, kami juga dibenarkan menggunakan pemboleh ubah penulis .

9. Kesimpulannya

Dalam artikel ini, kami telah membincangkan cara menggunakan try-with-resources, bagaimana mengganti try , catch , dan akhirnya dengan try-with-resources, membina sumber daya khusus dengan AutoCloseable dan memerintahkan sumber ditutup.

Kod sumber lengkap untuk contoh boleh didapati dalam projek GitHub ini.