ProgramlamaJava geliştiricisi

Java'da init blokları (başlatma blokları) nasıl çalışır ve bunlar konstrüktörlerden nasıl farklıdır? Init bloklarının kullanımını hangi durumlarda haklı kılar?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap

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:

  • Instance initializer blocks (static olmayan): her nesne oluşturulduğunda, değişkenler başlatıldıktan sonra ama konstrüktörden önce çalıştırılır.
  • Static initializer blocks (static anahtar kelimesi ile): JVM sınıfı yüklendiğinde bir kez çalıştırılı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.

Kurnaz Bir Soru

Soru: Bir nesne oluşturulduğunda alanlar, static bloklar, instance bloklar ve konstrüktörler hangi sırayla başlatılır?

Cevap:

  1. Önce static alanlar ve static bloklar (sınıf yüklendiğinde bir kez).
  2. Sonra instance alanlar ve instance bloklar (sınıfta göründükleri sıraya göre).
  3. Daha sonra konstrüktör çağrılır.

Konuyla ilgili karmaşık hatalardan gerçek örnekler


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ı.