제이온

[Etkin Java] Öğe 3. Özel Oluşturucu veya Enum Türüyle Tekil Olduğunu Garanti Et

  • Yazım Dili: Korece
  • Baz Ülke: Tüm Ülkelercountry-flag
  • BT

Oluşturulma: 2024-04-27

Oluşturulma: 2024-04-27 00:48

Tekil (Singleton)

Tekil Kavramı

Tekil, yalnızca bir örnek oluşturabilen bir sınıfı ifade eder. Tekilin tipik örnekleri arasında durumsuz nesneler veya benzersiz sistem bileşenleri yer alabilir. Ancak, tekil sınıflar, türü bir arayüz olarak tanımlanıp ve onun uygulamaya konulmasıyla tanımlanmamışsa test edilmesi zor olabilir.


Tekil Oluşturma Yöntemleri

public static ve final olan bir üye alanı kullanma



Özel (private) yapıcı, Elvis örneğini başlatırken yalnızca bir kez çağrılır ve tüm sistemde benzersiz bir örnek olmasını sağlar. Ancak, AccessibleObject.setAccessible() kullanılarak özel yapıcı çağrılabilir; bu yansıma yoluyla yapılan değişiklik, ikinci bir nesne oluşturulduğunda bir istisna fırlatılarak engellenebilir.


  • Avantajlar
    • Sınıfın tekil olduğu API'da açıkça belirtilir.
    • Kısa ve öz.


Statik Fabrika Yöntemini public static olarak kullanma


Yansıma yoluyla yapılan değişiklikler dışında, bu yöntem de tüm sistemde benzersiz bir örnek olmasını sağlar. Sadece alanı private olarak değiştiriyor ve nesne döndürme işlemini statik fabrika yöntemini kullanarak yapıyor.


  • Avantajlar
    • API'yi değiştirmeden tekil olmaktan çıkarmak mümkün.
      • Örneğin, statik fabrika yöntemi, her bir iş parçacığı için farklı bir örnek döndürmek üzere değiştirilebilir.
    • İstenirse, genel (generic) tekil fabrika yöntemine dönüştürülebilir.
    • Statik fabrikanın yöntem başvurusu, sağlayıcı olarak kullanılabilir.
      • Örneğin, Elvis::getInstance yerine Supplier<Elvis> olarak kullanılabilir.


Yukarıdaki avantajlardan yararlanmaya gerek yoksa ilk yöntemin kullanılması daha iyidir.


Enum Türünü Kullanma


En uygun yöntem, enum türünü kullanmaktır. Yukarıdaki iki yönteme göre yansıma saldırılarına karşı daha güvenli ve kod daha temizdir. Ayrıca, aşağıda da açıklandığı gibi, yukarıdaki iki yöntemin seri hale getirilmesi sırasında ek kod eklenmesi gerekir.

Ancak, oluşturulmak istenen tekil bir arayüzü miras alıyorsa da sınıfı miras alamayacağı konusunda dikkatli olunmalıdır.


Tekil Sınıfların Seri Hale Getirilmesinde Dikkat Edilmesi Gerekenler

Yukarıdaki yöntemlerden birincisi veya ikincisi ile oluşturulan tekil sınıfları seri hale getirmek için, yalnızca Serializable'ı uygulamanın yanı sıra, tüm örnek alanlarını geçici (transient) olarak bildirmeniz ve readResolve() yöntemini yeniden tanımlayarak sağlamanız gerekir.



Kaynaklar

Yorumlar0