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

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

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

challenge icon

Görev

Kolay

Try-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. Connection sınıfınız AutoCloseable arayüzünü uygulamalıdır. Bağlantı adı (String) için özel bir alana, adı alan ve [name] connection opened yazdıran bir yapıcıya (constructor), Executing on [name]: [sql] yazdıran bir query(String sql) metoduna ve [name] connection closed yazdıran gerekli close() metoduna sahip olmalıdır.
  • Session.java: Bir kullanıcı oturumunu simüle eden başka bir auto-closeable sınıf oluşturun. Session sınıfınız da AutoCloseable arayüzünü uygulamalıdır. Kullanıcı adı (String) için özel bir alan, kullanıcı adını alan ve Session started for [username] yazdıran bir yapıcı, [username] performed: [action] yazdıran bir performAction(String action) metodu ve Session ended for [username] yazdıran bir close() 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 bir Connection oluşturmak için try-with-resources kullanın. Try bloğunun içinde query("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 bir Connection (aynı adı kullanarak) hem de bir Session (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ı üzerinde query("INSERT INTO logs") metodunu çağırın, ardından oturum üzerinde girdi eylemiyle performAction metodunu ç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ır

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