Bu yazım bir önceki Singleton Design Pattern yazımın devamı niteliğinde. Singleton uygularken dikkat etmemiz gereken bazı önemli noktalar var. Kısaca bunlara değinmeye çalışacağım.
Öncelikle bu tasarım kalıbının amacı sınıftan sadece bir instance üretmek ve tüm uygulama boyunca bu tek instance kullanmak. Bundan dolayı bu tekil objeye erişebilmek için public tanımlı metotlar olmalıdır. Ayrıca herhangi bir geliştirmede singleton kullanan kısımları etkilemeden çoklu yapıya geçiş yapılabilmelidir. Bu da tabiki yazılım mimarisinin bir konusudur.
İncelediğim bazı kodlarda constructorların protected tanımlandığını gördüm. Başka paketlerde yer alan sınıflar bu sınıftan extend olamayacaktır; ama aynı paket içerisindeki sınıflar çok rahat şekilde extend edebilir ve dolayısıyla singleton ilkesi ihlal edilmiş olur. Bunun için singleton sınıf tek başına olacak şekilde başka bir pakete konulabilir veya constructor private tanımlanabilir. Ayrıca sınıf final olarak da tanımlanabilir. Böylece performans anlamında da katkıda bulunulmuş olunur.
Bir diğer problem konusu Serializable arayüzü. Bu arayüzü uygulayan bir sınıfı serialize ve deserialize olabileceği için birden çok instance oluşma ihtimali var.
Ve tabiki en meşhur başlık thread-safe olayı. Birden fazla thread aynı anda sınıf üzerinde işlem yaptığında singleton instance değerini yeniden new ederek değiştirebilir. Bu da istenmeyen bir durum. Böyle bir durumda şu yöntemler kullanılabilir.
- Singleton instance metot içerisinde değil de tanımının yapıldığı yerde direkt new edilebilir.
- Çift null kontrolü yapılabilir.
- Metot synchronized yapılabilir; fakat bu maliyetli bir iştir. Bunun yerine çift null kontrolündeki her kontrol arasında bir obje yardımı ile synchronized kullanılabilir.
Aslında Singleton tasarım kalıbı çok kolay ve basittir; ama yukarıda bahsettiğim başlıklardan dolayı sorunlar çıkartabilir. Mimarimiz ne kadar doğru ise karşılaştığımız sorunlar da o kadar çabuk çözülecektir.
Bol Java’ lı günler dileğiyle… 😀