Menu
Coddy logo textTech

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ır

Birden 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 fr

Kendi 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.

challenge icon

Görev

Kolay

try-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. Connection sınıfın AutoCloseable uygulamalıdır. Bağlantı adı (String) için private bir alan, adı alan ve [name] connection opened yazdıran bir kurucu, query(String sql) yazdıran bir Executing on [name]: [sql] metodu ve close() yazdıran gerekli [name] connection closed metodu olmalıdır.
  • Session.java: Kullanıcı oturumunu taklit eden başka bir otomatik kapatılabilir sınıf oluştur. Session sınıfın da AutoCloseable uygulamalıdır. Kullanıcı adı (String) için private bir alan, kullanıcı adını alan ve Session started for [username] yazdıran bir kurucu, performAction(String action) yazdıran bir [username] performed: [action] metodu ve close() yazdıran bir Session 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 bir Connection oluşturmak için try-with-resources kullan. try bloğunun içinde query("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 bir Connection (aynı adı kullanarak) hem de bir Session (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ı üzerinde query("INSERT INTO logs") çağrısını yap, ardından oturum üzerinde girdi olarak alınan işlemle performAction ç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
        
    }
}
quiz iconKendini test et

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

Kendi başına pratik yap: Online Java derleyicisi