post-images/etkin-singleton-sinif-kullanimi/cover.jpg

Singleton Sınıf Nedir? Nasıl Kullanılır?

“Günaydın ve olur da görüşemezsek iyi günler, iyi akşamlar ve iyi geceler.”

The Truman Show (1998)

Effective Java'nın bu bölümünde öğrendiğim konu singleton sınıfların daha etkin nasıl kullanılabileceği oldu. Hemen paylaşmak istedim. Öncelikle singleton sınıf nedir? Ne amaçla kullanılıyor onu irdelemek istiyorum.

Singleton, tekillik anlamına gelmekte. Yaptığı işten gelen bu isim nesnenin sadece bir kez yaratılması prensibine bağlanmış. Her yeni sınıf yaratma işlemi bellekte yeni bir alanı işaret edecek ve bazı durumlarda yeni bir sınıf yaratmak yerine önceden yaratılmış olanı kullanmak isteyebilirim. Mesela; bir veritabanı bağlantısı açtım tekrar tekrar açmama gerek yok aynı bağlantıyı kullanabilirim. Dosya işlemleriyle uğraşıyorum tekrar tekrar dosyaya erişip açmamın bir mantığı yok veya bir ağ portuna erişim verdiğimde… Bu örnektekiler gibi sadece bir kez gerçekleşmesini istediğim durumlarda kullanabiliyorum.

public class DBConnector {
    private static final DBConnector dbConnectorInstance = new DBConnector();
    
    private String url = "jdbc:postgresql://localhost:5432/jdbc";
    private String username = "root";
    private String password = "localhost";

    private DBConnector() {}

    public static DBConnector getInstance(String url, String username, String password) {
        dbConnectorInstance.url = url;
        dbConnectorInstance.username = username;
        dbConnectorInstance.password = password;
        
        return dbConnectorInstance;
    }
}

Daha önceden yaratılmış bir sınıf zaten elimde mevcut. Bu sinifi istedigim özellikler ile donatıp tekrar tekrar kullanıyorum. Burada dikkat etmeni istediğim sınıfımızın "private static final" ile sınıfımızın her zaman aynı nesne referansını sahip olacağını garantilemiş oluyoruz.

DBConnector dbConnector = DBConnector.getInstance("db-url", "emreyildirim","*****");

Dikkat ettiniz mi? Sınıfımızda dışarıdan erişilebilir (public) constructor yok. Yani new anahtar sözcüğü ile yeni bir obje değil, getInstance ile ilgili objenin bir örneğini istiyorum. Bunun nasil gerçekleştiğini şu yazımda aktardım bir göz atmak isteyebilirsin Static Factory Method vs Constructor getInstance metodu kullanılarak döndürülecek nesneyi kontrol altında tutabilmek için Static Factory'ı kullanabiliriz. Örn:

public class DBConnector {
    private static DBConnector dbConnectorInstance;    
    ...

    public static DBConnector getInstance(String url, String username, String password) {
        if (dbConnectorInstance == null) {
            DBConnector dbConnector = new DBConnector();
            dbConnector.url = url;
            dbConnector.username = username;
            dbConnector.password = password;
            dbConnectorInstance = dbConnector;
        }

        return dbConnectorInstance;
    }
}
JavaEffective JavaCreating and Destroying ObjectsDesign PatternsSingleton ClassSingularityInstance