Java'da başlatma blokları (init blokları), bir nesne örneği oluşturulurken oluşturucudan önce yürütülen özel kod bloklarıdır. İki türü vardır:
public class Example { static { System.out.println("Statik blok"); } { System.out.println("Nesne bloğu"); } public Example() { System.out.println("Konstrüktör"); } }
Yeni bir nesne oluşturulduğunda şu çıktılar olacaktır:
Statik blok
Nesne bloğu
Konstrüktör
Init blokları kullanmak, tüm konstrüktörler için ortak bir mantık gerektiğinde veya değişken açıklamasına sığmayan karmaşık bir başlatma gerektiğinde anlamlıdır. Ancak, genellikle tercih edilen yöntem konstrüktörlerdir.
Soru: Bir nesne oluşturulduğunda alanlar, static bloklar, instance bloklar ve konstrüktörler hangi sırayla başlatılır?
Cevap:
Hikaye
Büyük bir projede bir başlatma ile ilgili bir sorun ortaya çıktı: bir geliştirici ortak mantığı konstrüktörden init bloğuna taşıdı, çağrı sırasını göz önünde bulundurmadı. Sonuç olarak, bazı alanlar mantık çalışmadan önce düzgün bir şekilde başlatılmadı, bu da nesne oluşturma aşamasında NullPointerException hatasına yol açtı.
Hikaye
Büyük bir init bloğunun soyut bir sınıfta tekrar kullanılmasının ardından, diğer sınıflara miras verilmesi sırasında alt sınıfların başlatma sırasını düzgün bir şekilde geçersiz kılmaması beklenmedik davranışa ve init blokları ile konstrüktörlerin çağrı sırası ile ilgili hatalara yol açtı.
Hikaye
Bir geliştirici, statik alanların her yeni nesne oluşturulduğunda yeniden başlatılabileceğini varsayarak static bloğa kaynak temizleme mantığı ekledi. Bu, kaynakların sadece bir kez sınıf yüklendiğinde temizlenmesine neden oldu ve sonraki bellek yönetimi "bozuldu". Çünkü static bloğu yalnızca bir kez çağrıldığından, bu, kaynak sızıntılarına ve yanlış kaynak yönetimine yol açtı.