Örnek başlatıcı (instance initializer) sözdizimi, bir sınıfta, yöntemler ve yapıcılar dışında, süslü parantezler içinde yer alan özel bir kod bloğudur. Bu bloğa instance initializer block denir. Yeni bir sınıf nesnesi oluşturulduğunda, bu blok, üst sınıfın yapıcısının çağrısından hemen sonra ve mevcut sınıfın yapıcısının kodu çalıştırılmadan önce her seferinde çalıştırılır.
public class Example { { // Instance initializer block System.out.println("Örnek başlatma"); } private int x; public Example(int x) { this.x = x; System.out.println("Yapıcı"); } }
Instance initializer şu amaçlar için faydalıdır:
Eğer bir sınıfta hem instance initializer hem de bir yapıcı varsa, hangi sıralama ile çalıştırılırlar?
Cevap: Önce instance initializer çalıştırılır, ardından yapıcının kodu. Eğer sınıfta birden fazla instance initializer bloğu varsa, bunlar tanımlandıkları sırayla çalıştırılır.
Örnek:
public class Demo { { System.out.println("Instance initializer 1"); } public Demo() { System.out.println("Yapıcı"); } { System.out.println("Instance initializer 2"); } } // new Demo() çalıştırıldığında çıktı: // Instance initializer 1 // Instance initializer 2 // Yapıcı
Hikaye
Bir projede, bir geliştirici yöntemin veya yapıcının yerine instance initializer'da mantık yerleştirmişti. Sınıfın miras alınması ve yapıcının geçersiz kılınması durumunda instance initializer yine de çalıştı ve bu, beklenmedik bir başlatma sırasına ve iş mantığında hatalara yol açtı.
Hikaye
Başka bir projede, instance initializer sınıfın daha aşağıda başlatılan alanlarına erişiyordu. Değişkenlerin henüz başlatılmadığı ortaya çıktı ve nesne oluşturulurken NullPointerException hatası meydana geldi.
Hikaye
Ekip, instance initializer'a dış kaynaklarla (veritabanı) ilgili bir işlem ekledi. Bu nedenle her yapıcı çağrısı veritabanı ile bağlantı kuruyordu ve nesne gruplu oluşturulduğunda sistemi aşırı yükledi.