Statik başlatma bloğu, sınıfın JVM tarafından ilk kez yüklenmesi sırasında, sınıfın herhangi bir statik üyesinin ilk kullanılmasından veya sınıfın bir örneğinin oluşturulmasından önce yürütülen kod bloğudur.
Konunun Arka Planı:
Java, başlangıçtan beri tüm örnekler için ortak değerleri saklamak için statik alanlar sağlamıştır. Sınıfın başlangıcında standart dışı başlatma veya karmaşık hesaplamalar için static bloklar getirilmiştir.
Sorun:
Normal statik alanlar doğrudan ilan edilirken başlatılabilir, ancak başlatma uzun sürüyorsa, diğer sınıflara/dosyalara/DB'lere erişim gerektiriyorsa veya karmaşık bir mantığa bağlıysa, static bloklar kullanılması gerekir. Static blokların yanlış kullanımı, sınıf yüklemesi sırasında beklenmedik davranışlara, test etme zorluklarına ve hatta deadlock'lara yol açabilir.
Çözüm:
Static bloklar, statik kaynakların karmaşık başlatmaları için yalnızca, bunları tek bir ifade ile ifade etmenin mümkün olmadığı durumlarda kullanılır. İyi bir örnek, JDBC sürücülerinin yüklenmesi, konfigürasyonların okunmasıdır:
public class Config { public static Properties properties; static { properties = new Properties(); try (InputStream in = new FileInputStream("config.properties")) { properties.load(in); } catch (IOException e) { throw new ExceptionInInitializerError(e); } } }
Ana özellikler:
Statik blok içinde return kullanmak mümkün mü?
Hayır, return ifadesi statik bloklarda yasaktır. İstisna atmak için throw kullanılabilir.
Statik blok sınıf yüklendiğinde mi yoksa nesne oluşturulduğunda mı yürütülür?
Statik blok, sınıf yüklendiğinde bir kez yürütülür, nesne oluşturulmasa bile.
Bir sınıfta birden fazla static blok olabilir mi? Hangi sırayla yürütülürler?
Evet, birden fazla statik blok ilan edilebilir. Bunlar, sınıfın kodundaki sıraya göre yürütülür.
Statik blok büyük bir dosyayı okur ve dış bir hizmetle bağlantı kurar. Testlerde veya basit yardımcı programlarda sınıf JVM yavaş yüklenir.
Artıları:
Eksileri:
Statik blok başlatıldığında yazılım lisansının varlığını kontrol eder ve hata durumunda ExceptionInInitializerError fırlatır.
Artıları:
Eksileri: