Statik Metotlu Sınıf mı Yoksa Singleton mı? – I

Nesne-merkezli dillerde çok tartışılan konulardan birisi de hiç nesne oluşturmaya gerek bırakmadan kod yazmamızı sağlayan statik özellikler ve metotlar mı yoksa sadece bir tane nesne oluştuğundan emin olup, bu tek nesne üzerinde çağıracağımız nesne özellikleri ve metotları mı? Bu probleme kısaca statik-singleton (static vs. singleton) de denir çünkü tasarım kalıplarında, bir sınıftan sadece bir nesne oluşturmaya “singleton” yani “tekil” denir.

Bence statik kullanımı, tabi özellikle statik metot kullanımı, nesne-merkezli dillerin, yanlış kullanıma en fazla konu olanı ya da bir başka deyişle suistimale uğrayan alanı. Malum, loglama vb. utility metotlarını, üzerinde bulunduğu sınıfın nesnesini oluşturmadan hızlıca kullanmak isteriz. Örneğin aşağıda üzerindeki metotları statik olarak tanımlanmış ve bu yüzden de bu metotları kullanmak için nesnesine ihtiyaç duymayacağımız bir Log sınıfı vardır:

public class Log{
	
	public static void logInfo(String infoString){...}
	
	public static void logError(String errorString){...}

        ...
}

Bu sınıfın kullanım örneği de şöyle olabilir:

public class Client{
	public void doThis(){
                ...
                ...
               if(...)
                  Log.logInfo("...");
               else
                  Log.logError("...");
	}
}

Statik metotlara sahip böyle bir sınıfı kullanmanın kolaylığı çok açıktır: Sınıfın kendisini nesne gibi kullanmak. Dahası o tek nesneyi herhangi bir yere geçmenize bile gerek yok, doğrudan sınıfın üzerinden statik alanlara ve metotlara ulaşabilirsiniz.

Eğer yukarıdaki Log sınıfının metotlarını statik yapmak istemezsek ve bu sınıfın sadece bir tane nesnesinin olacağını planlıyorsak bu durumda Log sınıfını singleton olarak şöyle kodlardık:

public class LogSingleton{
	private static LogSingleton logger = new LogSingleton();
	
	private LogSingleton(){...}
	
	public static LogSingleton getInstance(){
		return logger;
	}
	
	public void logInfo(String infoString){...}
	
	public void logError(String errorString){...}
}

Bu durumda da yukarıdaki Client sınıfı şu şekilde değişirdi:

public class Client{
        private LogSingleton logger;

        public Client(){
                logger = LogSingleton.getInstance();
        }

	public void doThis(){
                ...
                ...
               if(...)
                  logger.logInfo("...");
               else
                  logger.logError("...");
	}
}

Şimdi soru şu: Hangi yöntemi kullanmalıyız?

Bazı diller bu ikilemi baştan çözmüşler ve yapılarına statik özellikler almamışlar. Örneğin Scala’da statik metotlu sınıf tanımlamanız mümkün değil, bunun yerine “object” anahtar kelimesiyle nesne tanımlıyorsunuz. Olan biten şey, Scala size doğrudan bir nesnesi olan sınıf tanımlamanızı sağlıyor. Güzel bir çözüm. Java, C#, C++ gibi dillerde ise statik kullanımı söz konusu olduğundan bu tartışma da geçerlidir. Bu durumda sizce hangi kullanımı tercih etmeliyiz ya da siz hangisini tercih ediyorsunuz? Statik metotlar mı yoksa singleton nesne mi?

Bu yazı toplam 1919 defa görüntülenmiştir.