Menu
CoddyTech

Pola Try-with-Resources

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Java di Coddy. Pelajaran 62 dari 87.

Saat bekerja dengan resource seperti aliran file atau koneksi database, kamu harus selalu menutupnya setelah selesai. Jika tidak, kamu berisiko mengalami kebocoran memori. Pendekatan tradisional menggunakan blok finally, tetapi pendekatan ini bertele-tele dan rentan terhadap kesalahan.

Pernyataan try-with-resources Java otomatis menutup sumber daya saat blok selesai. Class apa pun yang mengimplementasikan interface AutoCloseable dapat digunakan dengan sintaks ini:

// Pendekatan tradisional: panjang dan berisiko
BufferedReader reader = null;
try {
    reader = new BufferedReader(new FileReader("file.txt"));
    String line = reader.readLine();
} finally {
    if (reader != null) {
        reader.close();  // Ini juga bisa melempar pengecualian!
    }
}

// Try-with-resources: ringkas dan aman
try (BufferedReader reader = new BufferedReader(new FileReader("file.txt"))) {
    String line = reader.readLine();
}  // Ditutup secara otomatis di sini

Kamu dapat mengelola beberapa resource dengan memisahkannya menggunakan titik koma. Resource tersebut ditutup dalam urutan terbalik dari urutan deklarasinya:

try (FileReader fr = new FileReader("input.txt");
     BufferedReader br = new BufferedReader(fr)) {
    // Gunakan kedua sumber daya
}  // br ditutup terlebih dahulu, lalu fr

Untuk membuat class auto-closeable milikmu sendiri, implementasikan interface AutoCloseable dan satu-satunya method close():

public class DatabaseConnection implements AutoCloseable {
    public DatabaseConnection() {
        System.out.println("Connection opened");
    }
    
    @Override
    public void close() {
        System.out.println("Connection closed");
    }
}

Pola ini memastikan resource selalu dilepaskan dengan benar, bahkan jika terjadi exception selama pemrosesan.

challenge icon

Tantangan

Mudah

Mari kita buat sistem manajemen resource yang menunjukkan keunggulan try-with-resources! Kamu akan membuat class auto-closeable khusus yang menyimulasikan pengelolaan koneksi dan sesi, sehingga semuanya selalu dibersihkan dengan benar.

Kamu akan menyusun kodemu dalam tiga file:

  • Connection.java: Buat class yang menyimulasikan koneksi database. Class Connection-mu harus mengimplementasikan AutoCloseable. Class ini memerlukan field private untuk nama koneksi (String), constructor yang menerima nama dan mencetak [name] connection opened, method query(String sql) yang mencetak Executing on [name]: [sql], serta method close() yang wajib ada dan mencetak [name] connection closed.
  • Session.java: Buat class auto-closeable lain yang menyimulasikan sesi pengguna. Class Session-mu juga harus mengimplementasikan AutoCloseable. Sertakan field private untuk nama pengguna (String), constructor yang menerima nama pengguna dan mencetak Session started for [username], method performAction(String action) yang mencetak [username] performed: [action], serta method close() yang mencetak Session ended for [username].
  • Main.java: Satukan sistem manajemen resource-mu! Kamu akan menerima tiga input: nama koneksi, nama pengguna, dan tindakan yang akan dilakukan.

    Pertama, tunjukkan pengelolaan satu resource. Cetak === Single Resource ===, lalu gunakan try-with-resources untuk membuat Connection dengan nama yang diberikan. Di dalam blok try, panggil query("SELECT * FROM users"). Koneksi akan ditutup secara otomatis saat blok berakhir.

    Selanjutnya, tunjukkan pengelolaan beberapa resource. Cetak baris kosong, lalu === Multiple Resources ===. Gunakan try-with-resources dengan Connection (menggunakan nama yang sama) dan Session (menggunakan nama pengguna), yang dideklarasikan dalam urutan tersebut dan dipisahkan dengan titik koma. Di dalam blok try, panggil query("INSERT INTO logs") pada koneksi terlebih dahulu, lalu panggil performAction dengan tindakan dari input pada sesi. Perhatikan urutan resource ditutup secara terbalik!

Kamu akan menerima tiga input secara berurutan: nama koneksi (String), nama pengguna (String), dan tindakan (String).

Perhatikan bagaimana try-with-resources menghilangkan kebutuhan untuk memanggil close secara eksplisit dan menggunakan blok finally. Resource dijamin akan ditutup meskipun terjadi exception, dan beberapa resource akan ditutup dalam urutan deklarasi terbalik!

Coba sendiri

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String connectionName = scanner.nextLine();
        String username = scanner.nextLine();
        String action = scanner.nextLine();
        
        // === Single Resource ===
        // TODO: Cetak header
        // TODO: Gunakan try-with-resources untuk membuat Connection
        // TODO: Di dalam blok try, panggil query("SELECT * FROM users")
        
        // === Multiple Resources ===
        // TODO: Cetak baris kosong dan header
        // TODO: Gunakan try-with-resources dengan Connection dan Session
        // TODO: Di dalam blok try:
        //       - Panggil query("INSERT INTO logs") pada koneksi
        //       - Panggil performAction pada session dengan input action
        
    }
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler Java online