Try-With-Resources Yapısı
Coddy'nin Java Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 62 / 87.
Dosya akışları veya veritabanı bağlantıları gibi kaynaklarla çalışırken, işiniz bittiğinde bunları her zaman kapatmalısınız; aksi takdirde bellek sızıntısı riskiyle karşı karşıya kalırsınız. Geleneksel yaklaşım bir finally bloğu kullanır, ancak bu yöntem çok kelime gerektirir ve hataya açıktır.
Java'nın try-with-resources ifadesi, blok tamamlandığında kaynakları otomatik olarak kapatır. AutoCloseable arayüzünü uygulayan herhangi bir sınıf bu söz dizimi ile kullanılabilir:
// Geleneksel yaklaşım - ayrıntılı ve riskli
BufferedReader reader = null;
try {
reader = new BufferedReader(new FileReader("file.txt"));
String line = reader.readLine();
} finally {
if (reader != null) {
reader.close(); // Bu da bir istisna fırlatabilir!
}
}
// Try-with-resources - temiz ve güvenli
try (BufferedReader reader = new BufferedReader(new FileReader("file.txt"))) {
String line = reader.readLine();
} // Burada otomatik olarak kapatılırBirden fazla kaynağı noktalı virgülle ayırarak yönetebilirsiniz. Bildirim sırasının tersine göre kapatılırlar:
try (FileReader fr = new FileReader("input.txt");
BufferedReader br = new BufferedReader(fr)) {
// Her iki kaynağı kullanın
} // önce br kapatılır, sonra frKendi otomatik kapanabilir (auto-closeable) sınıfınızı oluşturmak için AutoCloseable arayüzünü ve onun tek close() metodunu uygulayın:
public class DatabaseConnection implements AutoCloseable {
public DatabaseConnection() {
System.out.println("Connection opened");
}
@Override
public void close() {
System.out.println("Connection closed");
}
}Bu desen, işleme sırasında istisnalar oluşsa bile kaynakların her zaman düzgün bir şekilde serbest bırakılmasını sağlar.
Görev
KolayTry-with-resources'ın gücünü gösteren bir kaynak yönetim sistemi kuralım! Bağlantıları ve oturumları yönetmeyi simüle eden, her zaman düzgün bir şekilde temizlenmelerini sağlayan özel auto-closeable sınıflar oluşturacaksınız.
Kodunuzu üç dosya halinde düzenleyeceksiniz:
Connection.java: Bir veritabanı bağlantısını simüle eden bir sınıf oluşturun.ConnectionsınıfınızAutoCloseablearayüzünü uygulamalıdır. Bağlantı adı (String) için özel bir alana, adı alan ve[name] connection openedyazdıran bir yapıcıya (constructor),Executing on [name]: [sql]yazdıran birquery(String sql)metoduna ve[name] connection closedyazdıran gerekliclose()metoduna sahip olmalıdır.Session.java: Bir kullanıcı oturumunu simüle eden başka bir auto-closeable sınıf oluşturun.Sessionsınıfınız daAutoCloseablearayüzünü uygulamalıdır. Kullanıcı adı (String) için özel bir alan, kullanıcı adını alan veSession started for [username]yazdıran bir yapıcı,[username] performed: [action]yazdıran birperformAction(String action)metodu veSession ended for [username]yazdıran birclose()metodu ekleyin.Main.java: Kaynak yönetim sisteminizi bir araya getirin! Üç girdi alacaksınız: bir bağlantı adı, bir kullanıcı adı ve gerçekleştirilecek bir eylem.İlk olarak, tekli kaynak yönetimini gösterin.
=== Single Resource ===yazdırın, ardından verilen adla birConnectionoluşturmak için try-with-resources kullanın. Try bloğunun içindequery("SELECT * FROM users")metodunu çağırın. Blok sona erdiğinde bağlantı otomatik olarak kapanmalıdır.Ardından, çoklu kaynakları gösterin. Boş bir satır, ardından
=== Multiple Resources ===yazdırın. Hem birConnection(aynı adı kullanarak) hem de birSession(kullanıcı adını kullanarak) ile noktalı virgüllerle bu sırayla bildirilmiş try-with-resources kullanın. Try bloğunun içinde, önce bağlantı üzerindequery("INSERT INTO logs")metodunu çağırın, ardından oturum üzerinde girdi eylemiyleperformActionmetodunu çağırın. Kaynakların bildirim sırasının tersine nasıl kapandığını izleyin!
Sırasıyla üç girdi alacaksınız: bağlantı adı (String), kullanıcı adı (String) ve eylem (String).
Try-with-resources'ın açıkça close çağrılarına ve finally bloklarına olan ihtiyacı nasıl ortadan kaldırdığına dikkat edin. İstisnalar oluşsa bile kaynakların kapanması garanti edilir ve birden fazla kaynak, bildirim sırasının tersine kapanır!
Kopya kağıdı
try-with-resources ifadesi, blok tamamlandığında kaynakları otomatik olarak kapatır. AutoCloseable arayüzünü uygulayan herhangi bir sınıf kullanılabilir:
try (BufferedReader reader = new BufferedReader(new FileReader("file.txt"))) {
String line = reader.readLine();
} // Burada otomatik olarak kapatılırBirden fazla kaynak, noktalı virgül ile ayrılarak yönetilebilir. Kaynaklar, bildirim sırasının tersine göre kapatılır:
try (FileReader fr = new FileReader("input.txt");
BufferedReader br = new BufferedReader(fr)) {
// Her iki kaynağı da kullan
} // önce br kapatılır, sonra frÖzel bir otomatik kapanabilir sınıf oluşturmak için AutoCloseable arayüzünü ve onun close() metodunu uygulayın:
public class DatabaseConnection implements AutoCloseable {
public DatabaseConnection() {
System.out.println("Connection opened");
}
@Override
public void close() {
System.out.println("Connection closed");
}
}Kendin dene
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();
// === Tekli Kaynak ===
// TODO: Başlığı yazdırın
// TODO: Bir Connection oluşturmak için try-with-resources kullanın
// TODO: try bloğunun içinde, query("SELECT * FROM users") metodunu çağırın
// === Çoklu Kaynak ===
// TODO: Boş bir satır ve başlığı yazdırın
// TODO: Hem Connection hem de Session ile try-with-resources kullanın
// TODO: try bloğunun içinde:
// - Bağlantı üzerinde query("INSERT INTO logs") metodunu çağırın
// - Oturum üzerinde giriş eylemiyle performAction metodunu çağırın
}
}
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Nesne Yönelimli Programlama bölümündeki tüm dersler
1OOP Temelleri
Harici DosyalarOOP'ye GirişSınıflar ve Nesnelerthis Anahtar KelimesiMetotlarAlanlar (Öznitelikler)Yapıcı MetotYapıcı Metot Aşırı YüklemeÖzet - Basit Hesap Makinesi4Kalıtım
Temel Kalıtım (extends)super Anahtar KelimesiMetot Geçersiz Kılma (@Override)Yapıcı Metot ZincirlemeObject SınıfıTekli ve Çok Seviyeli KalıtımNeden Çoklu Sınıf Kalıtımı Yok?Özet - Çalışan Hiyerarşisi7Özel Metotlar ve Object Sınıfı
toString() Metoduequals() ve hashCode()clone() MetoducompareTo() ve ComparableComparator ArayüzüÖzet - Özel Sıralama10OOP'de İstisna Yönetimi
İstisna Sınıfı HiyerarşisiÖzel İstisnalarDenetimli ve Denetimsiz HatalarTry-With-Resources YapısıÖzet - Doğrulanmış Kullanıcı2Erişim Belirleyiciler ve Kapsülleme
Erişim Seviyelerine Genel BakışGetter ve Setter MetotlarıBilgi Gizlemefinal Anahtar KelimesiÖzet - Banka Hesabı Yöneticisi5Polimorfizm
Metot Aşırı Yükleme TemelleriMetot Geçersiz Kılma (Çalışma Zamanı)Upcasting ve Downcastinginstanceof OperatörüSoyut Sınıflar ve MetotlarÖzet - Şekil Hesaplayıcı8İleri Düzey OOP Kavramları
Kompozisyon vs KalıtımAgregasyon vs KompozisyonDahili, Yuvalanmış ve Anonim SınıflarEnum'lar ve Enum MetotlarıRecords (Java 16+)Sealed Classes (Java 17+)11Tasarım Kalıpları Bölüm 1
Tasarım Kalıplarına GirişSingleton KalıbıFactory KalıbıBuilder KalıbıObserver KalıbıStrategy Kalıbı14Final Meydan Okumaları
E-Öğrenme PlatformuBankacılık SistemiOyun Karakteri GeliştirmeAraç Kiralama Servisi3Sınıf Özellikleri ve Statik Üyeler
Instance ve Statik DeğişkenlerStatik MetotlarStatik BloklarSabitler (static final)Özet - Sayaç ve Utility6Arayüzler ve Soyut Sınıflar
Arayüzlere GirişArayüzleri UygulamaÇoklu Arayüz UygulamaArayüzlerde Default ve StaticSoyut Sınıflar ve ArayüzlerFonksiyonel ArayüzlerÖzet - Ödeme Sistemi9Generics
Generics'e GirişGeneric SınıflarGeneric MetotlarSınırlandırılmış Tip ParametreleriWildcard'lar (?, extends, super)Özet - Generic Container12Tasarım Kalıpları Bölüm 2
Komut KalıbıAdaptör KalıbıDekoratör KalıbıŞablon Metot KalıbıDurum KalıbıKompozit KalıbıYineleyici Kalıbı