Java Tuzakları – II: Kurucu Görünümlü Metot

Malum, nesne-merkezli dillerde kurucu ya da yapılandırıcı (constructor) ismini verdiğimiz özel fonksiyonlar/metotlar vardır. Bu metotlar, nesne oluşturuken çağırılırlar ve genel olarak oluşturulan nesneyi gosteren bir referans geri döndürürler.

Nesne-merkezli dillerde kurucu metotlarla ilgili pek çok yaklaşım vardır. En temel soru da kurucunun isminin ve yapısının ne olacağıdır. Java, genelde Smalltalk geleneğini takip etmekle birlikte, Smalltalk’ta çok belirgin bir kurucu yapısı olmadığından, bu konuda genel olarak C++’ın yaklaşımı benimsenmiştir. Dolayısıyla Java’da kurucunun ismi, içinde bulunduğu sınıfın ismiyle aynıdır ve geriye bir değer döndüremez. Fakat bu, bir Java sınıfında, sınıfla aynı isimde, dolayısıyla kurucu görünümlü ama bir geri dönüş tipi olan, normal bir metot tanımlanamayacağı anlamına gelmez. Evet Java, sınıfla aynı isimde ama geri dönüş tipi olan metot tanımlamanıza izin verir. Bu metotun davranışının diğer, kurucu olmayan, normal metotlardan hiçbir farkı yoktur. Peki böyle bir izin neye sebep olabilir? Java kodu yazarken, sıra kurucılara geldiğinde, eğer alışkanlıkla sanki normal bir metot yazıyormuş gibi bir donüş tipi sağlarsanız, kurucu sağladığınızı sanırsınız ama olan biten bu değildir. Java derleyicisi, siz hiçbir kurucu yazmazsanız, varsayılan bir kurucu sağlayacağından, nesne oluşturabilirsiniz ama bu nesne sağladığınızı sandığınız kurucu koduyla değil, varsayılan kurucu ile oluşturulur.

Aşağıdaki kod parçasının 10 satırındaki ifadenin “5” basmasını beklersiniz ama o “0” basacaktır. Çünkü çağrılan sağladığınızı sandığınız kurucu değil varsayılan kurucudur.

public class ConstructorDemo {
private int i;

public void ConstructorDemo(){
i = 5;
}

public static void main(String[] args) {
ConstructorDemo d = new ConstructorDemo();
System.out.println(d.i);
}
}

Bu durum, tecrübeli Java’cılar için büyük bir problem oluşturmazken, yeni başlayanların canını bir miktar sıkabilir. Gerçi aklıllı ortamlar bu gibi ters köşe durumlar için uyarılar verirler ama bu ortamların verdiği değil uyarıları, hataları bile okumaya çalışan yeni programcı pek yoktur. 🙁 (Örneğin Eclipse, editöründe, bu satıra bir “warning sign” koyuyor. (Eclipse’in olur olmaz herşeye, örneğin İngilizce cümlelerinize bile, uyarı çıkarmasından bıkıp uyarıları toptan kapatmadıysanız, bunu farkedersiniz.) Idea IntelliJ ise ancak farenizi bu metotun üstüne getirdiğinizde uyarı veriyor. Netbeans’de ise bu konuyla ilgili bir uyarı göremedim.) Ya da kod geleneğine uygun olarak, “Camel notation”unu uygulayıp, sınıf isimlerini büyük harfle, metot isimlerini ise küçük harfle başlatırsanız, yine böyle bir hataya düşmekten kurtulursunuz ki bence bu ters köşeye en iyi çözüm de zaten bu.

Bol “kurucu”lu günler dilerim zira bu durum sizin daha fazla nesne-merkezli programama yaptığınızın göstergelerinden birisidir. 🙂

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