Effective Java Madde 41: İşaretçi Arayüzleri Tür Tanımlamak için Kullanın

İşaretçi arayüzler (marker interface) içlerinde hiçbir metot bulunmayan arayüzlerdir. Bunları uygulayan sınıfların amacı sahip oldukları bir özelliği ortaya çıkarmak için kendilerini işaretlemektir. Serializable arayüzü buna örnek olarak verilebilir. Bunu uygulayan sınıflar nesnelerinin bir ObjectOutputStream‘e yazılabileceğini diğer bir tabirle serileştirilebilir olduklarını belirtmiş olurlar.

Madde 39’da anlattığımız işaretçi notasyonlar varken işaretçi arayüzlerin gereksiz olduğunu düşünebilirsiniz ama bu doğru değildir. İşaretçi arayüzlerin iki tane üstünlüğü vardır. Birincisi ve en önemlisi işaretçi arayüzler uygulayan sınıflar için bir tür görevi görürler ancak notasyonlarda bu yoktur. İşaretçi arayüz türünün varlığı hataları derleme anında yakalamamızı sağlar. İşaretçi notasyonlar kullanıldığında ise çalışma zamanına kadar hataları farkedemeyiz.

Java’nın serileştirme mekanizması Serializable arayüzünü serileştirilebilir sınıfları işaretlemek için kullanmaktadır. ObjectOutputStream.writeObject metodu da parametre olarak serileştirilebilir bir nesne referansı bekler. Eğer geçilen tür Serializable arayüzünü uygulamıyorsa tür uyuşmazlığı nedeniyle derleyici hata verecektir.

İşaretçi arayüzlerin işaretçi notasyonlara karşı olan diğer bir üstünlüğü de işaretçileri kullanacak türleri daha açık hedefleyebilmeleridir. Bir notasyon eğer @Target meta notasyonu ile hedef olarak ElementType.TYPE belirtirse bu notasyon herhangi bir sınıf veya arayüze uygulanabilir. Ama diyelim ki siz sadece belli bir arayüzü uygulayan geçekleştirimlerin işaretlenebilmesini istiyorsunuz. Bunu işaretçi arayüz kullanarak yapabilirsiniz. İşaretçi arayüzü tanımlarken istediğiniz arayüzü kalıtabilirsiniz ve böylece işaretçi arayüzü uygulayan sınıflar aynı zamanda işaretçi arayüzün kalıttığı arayüzün de bir alt türü olacaktır.

Örneğin Set arayüzü sadece Collection alt türlerine uygulanabilir ancak bu arayüzü kalıttığı halde hiç yeni metot eklemez. Tam olarak bir işaretçi arayüz olduğu da söylenemez çünkü add, equals, hashCode gibi arayüz metotlarının sözleşmelerinde (contract) uyarlamalar yapar. Ancak başka bir arayüzü kalıtıp yeni bir metot eklemediği gibi metot sözleşmelerine de dokunmayan arayüzler hayal etmek zor değildir. Bu tarz arayüzler Serializable gibi başka sınıflar tarafından işlenebilecek türleri işaretlemek için kullanılabilir.

İşaretçi notasyonlar ise notasyon mekanizmasının parçası oldukları için notasyon tabanlı uygulama çatıları ile daha uyumlu çalışırlar.

Peki ne zaman işaretçi arayüz ne zaman işaretçi notasyon kullanmak gerekir? Sınıf veya arayüz harici program elemanlarını işaretlemek istiyorsanız notasyon kullanmanız gerektiği açıktır çünkü işaretçi arayüzleri sadece sınıflar veya başka arayüzler uygulayabilir. İşaretçi eğer sadece sınıflar ve arayüzler içinse, kendinize şu soruyu sorun: “Sadece bu işaretçiye sahip olan nesneleri kabul edecek metotlar yazmam gerekir mi?” Cevabınız evetse işaretçi arayüz kullanmanız gerekir. Bu sayede işaretçi arayüz tür olacağı için metot parametrelerinde kullanabilir ve derleme anında tür uyumunu garanti edebilirsiniz. Ancak yukarıdaki soruya net bir biçimde hayır yanıtını verebiliyorsanız, işaretçi notasyon kullanmanız daha mantıklı olabilir. Ek olarak, tanımladığınız işaretçi notasyonları sıklıkla kullanan bir çatının (framework) parçası olacaksa yine işaretçi notasyonları kullanmanız gerekir.

Özetle, işaretçi arayüzlerin de işaretçi notasyonların da kullanım alanları vardır. Eğer amacınız hiçbir metot eklemeden yeni bir tür tanımlamaksa o zaman işaretçi arayüz kullanmalısınız. Sınıf veya arayüz haricindeki program elemanlarını işaretlemek ve zaten notasyonları ağırlıkla kullanan bir çatıya işaretçi eklemek içinse işaretçi notasyonları kullanın. İşaretçi notasyon tanımlarken hedef (target) olarak ElementType.TYPE kullanıyorsanız bunun gerçekten notasyon mu yoksa işaretçi arayüz mü olması gerektiğini iki kere düşünün.

Bu maddede anlatılanlar Madde 22 ile aynı şeyi tersinden söylemektedir. Madde 22’de “tür tanımlamak istemiyorsanız arayüz kullanmayın” öğüdü varken burada “tür tanımlamak istiyorsanız arayüz kullanın” denilmektedir.

Share

Bir Cevap Yazın