Zemberek ile denemeler yapmak hoşuma gidince bir heves oldukça
eskimiş olan Java bilgimi tazelemek için kolları sıvadım. Java Language
Specification'ı indirdim ve okumaya başladım zaten. Arada da
denemeler yapıyorum ve bana ilginç gelen bir şey ile karşılaştım.
Dün gece, normalde yazmamamız gerektiğini düşündüğüm aşağıdaki gibi
bir sınıf oluşturdum. Basitçe sınıf main fonksiyonu içerisinde
kullanılmak üzere static bir nesne üretiyor (self) ve sonra iki public
değeri... Neyse kodu açıklamaya gerek yok, şunun gibi bir şey:
public class TestingProject {
static TestingProject self = new TestingProject();
final int y;
final static int x = self.y;
private TestingProject() {
y = x + 10;
}
public static void main(String[] args) {
System.out.println(self.y);
System.out.println(self.x);
}
}
Evet, biraz garip bir sınıf; bütün alanlar birbirine
bağımlı. Aslında benim ilk test kodum birden fazla sınıf ve sınıfların
içerisinde daha fazla alan içeriyordu, sorunu (!) anlayabilmek için
internette bulduğum örneklerin de etkisi ile gereksiz herşeyi
attım. Herneyse...
Sınıf derleniyor ve çalışıyor. Peki ne çıktı vermesini bekliyoruz?
Ben acemi bir göz ile baktığımda 'x' değeri neyse y değerinin onun 10
fazlası olmasını bekliyordum ama çalıştırıldığında ekrana iki tane 10
yazdı.
Ancak Spec'in Execution bölümünü okuduktan ve okuduklarımı
anlayabilmek için araştırma/deneme yaptıktan sonra nedenini
anlayabildim sanırım. Java'da sınıf ilklendirmesi (initialization)
sırasında öncelikle tüm static alanlara ön tanımlı değerleri
atanıyor. Bu durumda self nesnesi oluşturulurken 'x' alanının değeri
ön tanımlı 0 değerine sahip oluyor dolayısı ile 'y' 10 değerini
alıyor. Constructor çalıştıktan sonra da 'x'e 'y'nin değeri atanıyor.
Anladığım kadarı ile eğer 'x' self'e değil de başka bir nesneye
bağımlı olsaydı basitçe 'x'i self'in üstüne alıp sorunu
çözebilirdik. Sanırım bu örnek için yapabileceğimiz bir şey yok.
Yanlış yaparak öğrenmenin zevki bir başka :)