effective java - madde 3: kişiye özel(private) yapılandırıcı veya enum tipi ile...

7
EFFECTIVE JAVA – Madde 3 JOSHUA BLOCH BY İBRAHİM KÜRCE, @IBRAHIMKURCE

Upload: ibrahim-kuerce

Post on 14-Jan-2017

323 views

Category:

Software


2 download

TRANSCRIPT

Page 1: Effective Java - Madde 3: Kişiye özel(private) yapılandırıcı veya enum tipi ile tekiz(singleton) sınıf özelliğini zorlayın

EFFECTIVE JAVA – Madde 3JOSHUA BLOCHBY İBRAHİM KÜRCE, @IBRAHIMKURCE

Page 2: Effective Java - Madde 3: Kişiye özel(private) yapılandırıcı veya enum tipi ile tekiz(singleton) sınıf özelliğini zorlayın

BÖLÜM 2 : NESNELERİ OLUŞTURMA VE YOKETME

Bu bölüm nesneleri oluşturma ve yok etme ile ilgilidir. Bu bölümde, nesneler ne zaman ve nasıl oluşturulur, ne zaman ve nasıl oluşturulmaması gerekir, zaman kısıtlı durumlarda yok edilmesi nasıl sağlanır ve yok edilmeden önce nesnelere ait temizleme işlemleri nasıl yönetilir gibi sorulara cevap aranır.

Page 3: Effective Java - Madde 3: Kişiye özel(private) yapılandırıcı veya enum tipi ile tekiz(singleton) sınıf özelliğini zorlayın

Madde 3: Kişiye özel(private) yapılandırıcı veya enum tipi ile tekiz(singleton) sınıf özelliğini zorlayın.

Tekiz sınıf tek bir kere örneklenen sınıf demektir. Tekizler genelde bir sistem bileşeni gösterir, bu bileşen tektir. Örneğin pencere yönetimi(window manager) veya dosya sistemi. Bir sınıfı tekiz yapmak, o sınıfı test etmeyi zorlaştırabilir, çünkü tekiz sınıflar için yerine geçecek taklit(mock) gerçeklemeler yapmak imkansızdır. Tekiz sınıf kendi tipi olarak bir arayüzü gerçeklemişse o zaman test edilebilir.

Java 1.5 sürümünden önce, tekiz sınıf yapabilmek için 2 yöntem vardı. İkisi de, yapılandırıcıyı kişiye özel yapıp, public statik üye metodu ile sınıfın tek örneğine erişim sağlamak üzerine kuruluydu. Bir yaklaşımda, üye bir değişmez alandır:

Page 4: Effective Java - Madde 3: Kişiye özel(private) yapılandırıcı veya enum tipi ile tekiz(singleton) sınıf özelliğini zorlayın

Madde 3: Kişiye özel(private) yapılandırıcı veya enum tipi ile tekiz(singleton) sınıf özelliğini zorlayın.

Kişiye özel yapılandırıcı, Elvis.INSTANCE public statik değişmez alanını oluşturmak için bir kere çağrılır. Public veya korumalı(protected) yapılandırıcının olmaması tek bir örneği olmasını garantiler. Hiçbir kullanıcı bunu değiştiremez ama tek bir ikaz edilecek durum var. Bu durum, ayrıcalıklı bir kullanıcı kişiye özel yapılandırıcısını yansıma özelliğiyle (reflectively) çağırabilir. Bunu AccessibleObject.setAccessible metodunun yardımıyla yapar. Bu atağa karşı koymak istiyorsanız, yapılandırıcıyı ikinci kez çağrılma durumunda hata fırlatacak şekilde değiştirmeniz gerekiyor.

İkinci yaklaşım ise, public bir üye olan statik fabrika metodudur:

Page 5: Effective Java - Madde 3: Kişiye özel(private) yapılandırıcı veya enum tipi ile tekiz(singleton) sınıf özelliğini zorlayın

Madde 3: Kişiye özel(private) yapılandırıcı veya enum tipi ile tekiz(singleton) sınıf özelliğini zorlayın.

Elvis.getInstance metoduna yapılan tüm çağrılar aynı nesne referansını döner ve başka bir nesne oluşturulmaz.

Public alan yaklaşımının başlıca avantajı, sınıfı tekiz yapmak için gerekli tanımlar temizdir. Public statik alan bir değişmez alandır ve aynı nesne referansını tutar. Modern JVM gerçeklemelerinde bu yöntemin başka bir avantajı yoktur. Statik fabrika metodu ile hemen hemen aynı sürede çalıştırılır.

Fabrika metod yaklaşımının bir avantajı ise bu size esneklik sağlar. Sonradan sınıfın tekiz olup olmamasına, sınıfın kütüphanesini değiştirmeden, karar verebilirsiniz. Fabrika metodu tek bir örnek döner ama sonradan mesela her bir kanal(thread) başına tek bir örnek dönecek şekilde kolayca değiştirebilirsiniz. Diğer bir avantaj jenerik tiplerle alakalıdır, madde 27 de tartışılmıştır. Genel olarak değişmez alan yaklaşımı daha basittir.

Page 6: Effective Java - Madde 3: Kişiye özel(private) yapılandırıcı veya enum tipi ile tekiz(singleton) sınıf özelliğini zorlayın

Madde 3: Kişiye özel(private) yapılandırıcı veya enum tipi ile tekiz(singleton) sınıf özelliğini zorlayın.

Gerçekleyen sınıfın tanımına Serializable(Bölüm 11) eklemek, sınıfı tekiz yapabilmek için yeterli değildir. Sınıfın tekiz olmasını garanti etmek için, sınıfın bütün alanlarını geçici(transient) tanımlamanız ve readResolve metodunu(Madde 77) tanımlamanız gerekir. Diğer türlü, serilize edilmemiş nesne her serilize edildiğinde, yeni bir örnek oluşturulur bu da tekiz olma özelliğini bozar. Bunu önlemek için readResolve metodu Elvis sınıfına eklenir:

Page 7: Effective Java - Madde 3: Kişiye özel(private) yapılandırıcı veya enum tipi ile tekiz(singleton) sınıf özelliğini zorlayın

Madde 3: Kişiye özel(private) yapılandırıcı veya enum tipi ile tekiz(singleton) sınıf özelliğini zorlayın.

Java 1.5 sürümünden sonra, tekiz yapabilmek için 3. yöntem eklenmiştir. Bu da tek bir elemanı olan Enum tipi tanımlamak:

Bu yaklaşım public alan yaklaşımına benzerdir ama daha sağlamdır. Serilizasyon mekanizması otomatik olarak sağlanır ve çoklu örnek oluşturmaya karşı sağlam bir koruması vardır. Hatta karmaşık serilizasyon ataklarına karşı bile korunur. Tek bir elemanlı enum tipi ile tekiz yapılar oluşturmak en iyi yöntemdir.