Java'da statik başlatıcı, {} süslü parantezler içinde yer alan ve static anahtar kelimesiyle başlayan bir kod bloğudur. Bu blok, sınıfın JVM'ye yüklenmesi sırasında, o sınıfın herhangi bir örneği oluşturmadan ve herhangi bir statik yöntemi çağırmadan önce bir kez çalıştırılır. Temel görevi, statik değişkenlerin karmaşık bir şekilde başlatılmasını gerçekleştirmektir.
public class Example { static int staticValue; static { staticValue = 10; // Karmaşık başlatma mantığı System.out.println("Statik başlatma bloğu çalıştırıldı"); } }
Statik başlatıcı, özellikle statik değişkenin diğer kaynaklara bağımlı olduğu veya sınıf yüklenirken işlenmesi gerektiği durumlarda faydalıdır.
Soru: "Java'da statik blokların ve statik değişkenlerin başlatılması hangi sırayla gerçekleşir, eğer sınıftaki tanımlanma sıraları farklıysa?"
Doğru cevap: Tüm statik değişkenler ve bloklar, sınıfın kaynak kodunda tanımlandıkları sıraya göre (yukarıdan aşağıya) başlatılır. Eğer bir statik değişken, tanımından yukarıda yer alan bir statik blokta kullanılıyorsa, derleme hatası verecek veya beklenmedik bir değere yol açabilir.
class Order { static { System.out.println(X); // varsayılan değer: 0 } static int X = 100; static { System.out.println(X); // 100 } }
Hikaye
Büyük bir projede loglayıcıyı statik blok aracılığıyla başlatmaya çalıştılar, ancak değişkenlerin ve statik blokların tanımlarını değiştirdiklerinde, loglayıcı değişkeni arama anında başlatılmamış hale geldi ve bu, sınıf yüklenirken NullPointerException hatasına yol açtı.
Hikaye
JDBC aracı geliştirilirken, sürücüler statik blokta başlatılıyordu. Geliştiricilerden biri, yolu içeren String değişkeninin tanımını statik bloğun altına taşıdı ve kod veritabanına doğru bir şekilde bağlanmaktan vazgeçti - yol null oldu.
Hikaye
Dağıtık bir sistemde yapılandırma verilerinin yüklenmesinde problemler ortaya çıktı: bazı mantık, birbirine karşılıklı başvurularla birkaç sınıfta statik bloklar aracılığıyla gerçekleştirildi ve bu, yanlış organize edilen statik bloklar ve bağımlılıklar nedeniyle döngüsel başlatmalara ve uygulamanın başlama anında StackOverflowError'a neden oldu.