30 Eylül 2014 Salı

Disposable

Garbage Collector Tarafından Çağırılan Metodlar
Bir nesne yok edilirken Java'da finalize(), C#'ta ise Dispose() metodu çağırılıyor. Bu metodların içinde unmanaged resource'lar varsa onları serbest bırakmak mümkün.


Finalize veya IDisposable Arayüzleri
C# 
IDisposable arayüzünden kalıtmak gerekir.
Not : C#'ta Finalize metodu da var. Ancak bu metodu kullanmamak gerekir.

Implement IDisposable only if you are using unmanaged resources directly. If your app simply uses an object that implements IDisposable, don't provide an IDisposable implementation.

Örnek:
public class MyClass : IDisposable {
  
    public virtual void Dispose() {
        ...
    }
}
Eğer birden çok resource bırakılacaksa generic bir Dispose metodu da kullanılabilir.
private static void Dispose<T>(ref T obj) where T : class, IDisposable {
    if(obj != null) {
        try { obj.Dispose(); } catch {}
        obj = null;
    }
}

public virtual void Dispose() {
    Dispose(ref stream);
    Dispose(ref log);
}


Finalize veya Dispose İşleminin Hemen Çağırılması
C#
using ifadesi içine bir veya daha çok sınıf verilerek kod bloğundan çıkınca kaynakların hemen bırakılması sağlanabilir. Örnek:
using (Font font3 = new Font("Arial", 10.0f),
            font4 = new Font("Arial", 10.0f))
{
    // Use font3 and font4.
}


Java'da şu anda using benzeri bir kullanım yok ancak Java 7'de buradaki gibi olacak.

Java Closeable Arayüzü
Java'da C#'taki gibi using kullanımı yok ancak bazı sınıflar için özel bir arayüz geliştirilmiş.
Özellikle stream sınıfları Closeable arayüzünden türüyorlar. Bu arayüz ile finalize metodunun çalıştırılmasını beklemeden stream kapatılabiliyor ve kaynaklar serbest kalabiliyor. Closeable arayüzü close() metodunda IOException attığı için daha çok stream'ler için düşünülmüş. Örneğin ResultSet  veya socket sınıfları close() metodları olmasına rağmen bu arayüzü kullanmıyorlar.


Hiç yorum yok:

Yorum Gönder