Bu doğrudan http://www.programcreek.com/2011/10/java-class-instance-initializers/ adresinden
1. Yürütme Emri
Aşağıdaki sınıfa bakın, hangisinin önce idam edildiğini biliyor musunuz?
public class Foo {
//instance variable initializer
String s = "abc";
//constructor
public Foo() {
System.out.println("constructor called");
}
//static initializer
static {
System.out.println("static initializer called");
}
//instance initializer
{
System.out.println("instance initializer called");
}
public static void main(String[] args) {
new Foo();
new Foo();
}
}
Çıktı:
statik başlatıcı denir
örnek başlatıcısı çağrıldı
denilen kurucu
örnek başlatıcısı çağrıldı
denilen kurucu
2. Java örneği başlatıcısı nasıl çalışır?
Yukarıdaki örnek başlatıcısı bir println ifadesi içeriyor. Nasıl çalıştığını anlamak için, bunu değişken atama ifadesi olarak ele alabiliriz, örn b = 0
. Bu, anlaşılmasını daha açık hale getirebilir.
Onun yerine
int b = 0
, yazabilirsin
int b;
b = 0;
Bu nedenle, örnek başlatıcıları ve örnek değişken başlatıcıları hemen hemen aynıdır.
3. Örnek başlatıcıları ne zaman yararlıdır?
Örnek başlatıcılarının kullanımı nadirdir, ancak yine de aşağıdaki durumlarda örnek değişken başlatıcılarına yararlı bir alternatif olabilir:
- Başlatıcı kodu istisnaları işlemelidir
- Bir örnek değişkeni başlatıcısı ile ifade edilemeyen hesaplamalar yapın.
Tabii ki, bu kod yapıcılara yazılabilir. Ancak bir sınıfın birden çok kurucusu varsa, kodu her kurucuda tekrarlamanız gerekir.
Bir örnek başlatıcısıyla, kodu bir kez yazabilirsiniz ve nesneyi oluşturmak için hangi kurucu kullanılırsa kullanılsın kod yürütülür. (Sanırım bu sadece bir kavram ve sık kullanılmıyor.)
Örnek başlatıcılarının yararlı olduğu başka bir durum, hiçbir kurucu bildiremeyen anonim iç sınıflardır. (Bu, bir kayıt işlevi yerleştirmek için iyi bir yer olacak mı?)
Derhein'a teşekkürler.
Ayrıca, arabirimleri uygulayan anonim sınıfların [1] yapıcıları olmadığını unutmayın. Bu nedenle, inşaat sırasında her türlü ifadeyi yürütmek için örnek başlatıcılara ihtiyaç vardır.
public static void staticMethod(){}
varsa, yürütmekTestStatic.class.getMethod("staticMethod");
. Statik başlatıcı çağrılmaz. Daha fazla bilgi burada docs.oracle.com/javase/specs/jvms/se10/html/...