Yeni Javacının Sefaleti ya da Poverty of a Newbie Java Programmer

Yazı dizisi olan yayınlamaya başladığım Java Kodunuzun Nesne-Merkezli Olmadığının 10 İşareti başlıklı yazıların ilkinde aşırı statik metot kullanımını ele almıştım. Bu yazıda bir yerde şöyle dedim:

“… (statik metotların aşırı kullanımı) Programlamada yeni olan ya da tamamen prosedürel dünyaya alışkın programcıların Java kodu yazmaya başladıklarında sıklıkla karşılaştıkları bir durumdur. Problemli olan şey, statik kullanımının bulaşıcı ve yayılma eğiliminde olduğu gerçeğidir. Bir sınıf oluşturup üzerine statik metotlar ve alanlar koymaya başladığınızda kısa sürede kendinizi sadece statik metot yazarken bulacaksınız.”

Evet doğru, bir kere statik kullanmaya başladınız mı, her şeyin artık statik olarak devam etmesini engelleyemezsiniz. Statik kullanmada, bahsettiğim yazıda açıkladığım gibi bir problem yok, doğru yerde kullandığınız müddetçe.

Statik kullanımının nasıl bulaşıcı olduğunu göstermek için genelde Java’ya giriş eğitimlerinde kendi kendime konuşarak bir oyun oynarım, bir monolog yani. Bu oyundaki kişi yeni yetişmekte olan bir Javacıdır. Bu Javacı okulda almış olduğu örneğin “Java ile nesne-merkezli programlamaya giriş” isimli dersin hocasının verdiği program örneğinin benzerini eve gelip, kendisi yapmaya çalışmaktadır. Tek derdi bir değişkene bir değer atayıp sonra da onu ekrana basmaktır. Yani şöyle bir sınıf yazar:

public class MyFirstOOProgram {

	private int i = 5;

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

Yukarıda da görüldüğü gibi yeni bir Javacı ya da nesne-merkezli programlamaya yeni başlamış olan arkadaşımızın yapmak istediği şey, bir nesne değişkeni tanımlayıp sonra da main metodunda onu print etmektir. Son derece masum bir istek 🙂 Evet “i”yi nesne değişkeni olarak tanımlıyor ama aslında derdi “nesne değişkeni” tanımlamak değil, çünkü daha nesnenin ne olduğunu bilmiyor, henüz kafasına oturmuş durumda değil. Derdi sadece bir değişken tanımlayıp onu print etmek. Aslında bu değişkeni main metotta tanımladığında problem olmuyor ama main metodunun dışında tanımladığında problem olduğunu görüyor. Derleyici “System.out.println(i);” satırında problem veriyor ve “Can not make a static reference to non-static variable i” gibi bir mesaj veriyor. Tabi sonuçta yeni Javacı için bu mesaj hiç bir anlam ifade etmiyor.

Yeni Javacımız bu problemin üstesinden gelmeye kararlı. Ve programcılığın gereği olarak başlıyor hatayı giderebilmek için programın orasıyla burasıyla oynamaya. Amaç bu “i” 5 olarak basılacak 🙂 Lafı uzatmayalım, pek çok denemeden sonra “i” değiskenini tanımladığı satıra “static” anahtar kelimesini koyduğunda yani satırı “private static int i = 5;” şekline getirdiğinde programı çalışıyor. Yani yeni Javacı olan arkadaşın ilk nesne-merkezli programı basit bir “static” eklemesiyle şu hale geldi ve çalıştı;

public class MyFirstOOProgram {

	private static int i = 5;

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

}

Nesne-merkezli programlamayı bilmeyen, muhtemelen kendisine “Google programcısı” sıfatı daha uygun düşen arkadaşımız, “i” değişkenini instance için tanımlamak yerine class için tanımlar hale gelince problemini çözdü ama o böyle düşünmüyor. Eksik olan şeyin “static” olduğunu düşünüyor. Olması gereken, artık nesne-merkezli programlama yaptığının farkında olup, “i”nin bir nesne içın tanımladığı gerçeğininden hareketle print edilecek ‘i”nin basit bir değişken olmayıp, bir nesnenin parçası olduğunu ifade etmesiydi. Yani “i”yi statik yapmak yerine önce bir nesne tanımlayıp sonra sonra o nesnenin “i” değişkenini print etmeliydi:

public class MyFirstOOProgram {

	private int i = 5;

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

}

Nesne yaratıp o nesnenin üzerinden “i”ye erişmek yerine “i”yi statik yapınca probleminin çözüldüğünü düşündü ve bütün bu maskaralık da burada başladı zaten. Bakın devamında ne oluyor.

Arkadaşımız bir de metot yaratıp, onun içinde “i”yi print etmek ister. Ve bu amaçla programa bir “f()” metodu ekler:

public class MyFirstOOProgram {

	private static int i = 5;

	public static void main(String[] args) {
		System.out.println(i);

		f();
	}

	public void f() {
		System.out.println(i);
	}

}

Tabi derleyici bu sefer de main metodundaki “f();” satırında problem verir. Ve, arkadaşımız ne düşünür? “İster misin problem f() metodunun statik olmaması olsun?”. Ve “f()” metodunu da statik yapar:

public class MyFirstOOProgram {

	private static int i = 5;

	public static void main(String[] args) {
		System.out.println(i);

		f();
	}

	public static void f() {
		System.out.println(i);
	}

}

Bu kod da

5
5

basar ve görev tamamlanır. Kısa bir denemeden çıkan ana fikir şudur: Java’da her şeyi statik yaparsan her şey yolunda gider. Bir problem varsa bir yerleri statik yaparak çözebilirsin.” 🙂

Yukarıdaki koda artık ne eklerseniz statik olmak zorundadır. Herhangi bir yeni değişken class değişkeni, herhangi bir metot da sınıf metodu olmalıdır. İşte bu yüzden “static” anahtar kelimesi bulaşıcıdır.

Aslolan statik değil nesnedir. O yüzden “nesne-merkezli” programlama diyoruz.

Toplam görüntülenme sayısı: 1536