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şılaşırsınız. Geleneksel yaklaşım bir finally bloğu kullanır, ancak bu yaklaşım ayrıntılı 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 dizimiyle 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(); // Bir istisna da 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üllerle ayırarak yönetebilirsiniz. Bunlar, 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ğı kullan
} // br önce kapatılır, sonra frKendi otomatik kapanabilir 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 kalıp, işleme sırasında istisnalar oluşsa bile kaynakların her zaman uygun şekilde serbest bırakılmasını sağlar.
Görev
Kolaytry-with-resources özelliğinin gücünü gösteren bir kaynak yönetimi sistemi oluşturalım! Bağlantıları ve oturumları yönetmeyi taklit eden özel otomatik kapatılabilir sınıflar oluşturacak ve bunların her zaman düzgün bir şekilde temizlenmesini sağlayacaksın.
Kodunu üç dosyaya ayıracaksın:
Connection.java: Veritabanı bağlantısını taklit eden bir sınıf oluştur.ConnectionsınıfınAutoCloseableuygulamalıdır. Bağlantı adı (String) için private bir alan, adı alan ve[name] connection openedyazdıran bir kurucu,query(String sql)yazdıran birExecuting on [name]: [sql]metodu veclose()yazdıran gerekli[name] connection closedmetodu olmalıdır.Session.java: Kullanıcı oturumunu taklit eden başka bir otomatik kapatılabilir sınıf oluştur.Sessionsınıfın daAutoCloseableuygulamalıdır. Kullanıcı adı (String) için private bir alan, kullanıcı adını alan veSession started for [username]yazdıran bir kurucu,performAction(String action)yazdıran bir[username] performed: [action]metodu veclose()yazdıran birSession ended for [username]metodu ekle.Main.java: Kaynak yönetimi sistemini bir araya getir! Üç girdi alacaksın: bir bağlantı adı, bir kullanıcı adı ve gerçekleştirilecek bir işlem.İlk olarak tek bir kaynak yönetimini göster.
=== Single Resource ===yazdır, ardından verilen adla birConnectionoluşturmak için try-with-resources kullan. try bloğunun içindequery("SELECT * FROM users")çağrısını yap. Blok sona erdiğinde bağlantı otomatik olarak kapatılmalıdır.Ardından birden fazla kaynağı göster. Önce boş bir satır, sonra
=== Multiple Resources ===yazdır. Hem birConnection(aynı adı kullanarak) hem de birSession(kullanıcı adını kullanarak) ile try-with-resources kullan; bunları noktalı virgüllerle belirtilen sırada tanımla. try bloğunun içinde önce bağlantı üzerindequery("INSERT INTO logs")çağrısını yap, ardından oturum üzerinde girdi olarak alınan işlemleperformActionçağrısını yap. Kaynakların ters sırada nasıl kapatıldığını gözlemle!
Üç girdiyi şu sırayla alacaksın: bağlantı adı (String), kullanıcı adı (String) ve işlem (String).
try-with-resources özelliğinin açıkça close çağrıları ve finally blokları yazma gereğini nasıl ortadan kaldırdığına dikkat et. İstisnalar oluşsa bile kaynakların kapatılması garanti edilir ve birden fazla kaynak, tanımlanma sırasının tersine kapatılır!
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();
// === Single Resource ===
// TODO: Başlığı yazdır
// TODO: Bir Connection oluşturmak için try-with-resources kullan
// TODO: Inside the try block, call query("SELECT * FROM users")
// === Multiple Resources ===
// TODO: Boş bir satır ve başlığı yazdır
// TODO: Hem Connection hem de Session ile try-with-resources kullan
// TODO: try bloğunun içinde:
// - Call query("INSERT INTO logs") on the connection
// - session üzerinde girdi action ile performAction çağır
}
}
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ıKendi başına pratik yap: Online Java derleyicisi