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 siniKamu 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 frUntuk 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.
Tantangan
MudahMari 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. ClassConnection-mu harus mengimplementasikanAutoCloseable. Class ini memerlukan field private untuk nama koneksi (String), constructor yang menerima nama dan mencetak[name] connection opened, methodquery(String sql)yang mencetakExecuting on [name]: [sql], serta methodclose()yang wajib ada dan mencetak[name] connection closed.Session.java: Buat class auto-closeable lain yang menyimulasikan sesi pengguna. ClassSession-mu juga harus mengimplementasikanAutoCloseable. Sertakan field private untuk nama pengguna (String), constructor yang menerima nama pengguna dan mencetakSession started for [username], methodperformAction(String action)yang mencetak[username] performed: [action], serta methodclose()yang mencetakSession 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 membuatConnectiondengan nama yang diberikan. Di dalam blok try, panggilquery("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 denganConnection(menggunakan nama yang sama) danSession(menggunakan nama pengguna), yang dideklarasikan dalam urutan tersebut dan dipisahkan dengan titik koma. Di dalam blok try, panggilquery("INSERT INTO logs")pada koneksi terlebih dahulu, lalu panggilperformActiondengan 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
}
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1Dasar-Dasar OOP
File EksternalPengantar OOPClass dan ObjectKata Kunci thisMethodField (Atribut)Method KonstruktorOverloading KonstruktorRangkuman: Kalkulator Sederhana4Pewarisan
Pewarisan Dasar (extends)Kata Kunci superMethod Overriding (@Override)Rantai KonstruktorKelas ObjectPewarisan Tunggal dan BertingkatMengapa Tidak Ada Pewarisan Multi-KelasRangkuman: Hierarki Karyawan7method Khusus & class Object
method toString()equals() dan hashCode()method clone()compareTo() dan ComparableAntarmuka ComparatorUlasan: Pengurutan Kustom10Penanganan Exception dalam OOP
Hierarki class ExceptionException KustomError Checked vs UncheckedPola Try-with-ResourcesRekap: Pengguna Tervalidasi2Modifier Akses & Enkapsulasi
Ikhtisar Tingkat AksesMethod Getter dan SetterPenyembunyian InformasiKata Kunci finalUlasan: Pengelola Rekening Bank5Polimorfisme
Dasar method overloadingMethod overriding (Saat program berjalan)Upcasting dan downcastingOperator instanceofclass dan method abstrakUlasan: Kalkulator Bentuk8Konsep OOP Lanjutan
Komposisi vs PewarisanAgregasi vs Komposisiinner, nested, dan anonymous classEnum dan method Enumrecord (Java 16+)sealed class (Java 17+)11Pola Desain Bagian 1
Pengantar Pola DesainPola SingletonPola FactoryPola BuilderPola ObserverPola Strategy3property class dan Anggota Statis
Variabel Instance vs Statismethod StatisBlok StatisKonstanta (static final)Rangkuman: Penghitung dan Utilitas6Antarmuka & Kelas Abstrak
Pengantar AntarmukaMengimplementasikan AntarmukaImplementasi Beberapa AntarmukaDefault & Static pada AntarmukaKelas Abstrak vs AntarmukaAntarmuka FungsionalRekap: Sistem PembayaranLatihan sendiri: Compiler Java online