Genel olarak, statik olmayan başlatıcı blokları kullanmayın (ve statik olanlardan da kaçının).
Kafa karıştırıcı Sözdizimi
Bu soruya bakıldığında 3 cevap var, ancak bu sözdizimiyle 4 kişiyi kandırdınız. Onlardan biriydim ve 16 yıldır Java yazıyorum! Açıkça, sözdizimi potansiyel olarak hataya açıktır! Ondan uzak dururdum.
Teleskop Yapıcılar
Gerçekten basit şeyler için, bu karışıklığı önlemek için "teleskop" yapıcılarını kullanabilirsiniz:
public class Test {
private String something;
// Default constructor does some things
public Test() { doStuff(); }
// Other constructors call the default constructor
public Test(String s) {
this(); // Call default constructor
something = s;
}
}
Oluşturucu Deseni
Her yapıcı veya diğer karmaşık başlatma işlemlerinin sonunda doStuff () yöntemine ihtiyacınız varsa, belki de bir oluşturucu deseni en iyisi olacaktır. Josh Bloch , inşaatçıların iyi bir fikir olmasının birkaç nedenini listeler. Inşaatçılar yazmak için biraz zaman alır, ama düzgün yazılmış, kullanmak için bir zevk.
public class Test {
// Value can be final (immutable)
private final String something;
// Private constructor.
private Test(String s) { something = s; }
// Static method to get a builder
public static Builder builder() { return new Builder(); }
// builder class accumulates values until a valid Test object can be created.
private static class Builder {
private String tempSomething;
public Builder something(String s) {
tempSomething = s;
return this;
}
// This is our factory method for a Test class.
public Test build() {
Test t = new Test(tempSomething);
// Here we do your extra initialization after the
// Test class has been created.
doStuff();
// Return a valid, potentially immutable Test object.
return t;
}
}
}
// Now you can call:
Test t = Test.builder()
.setString("Utini!")
.build();
Statik Başlatıcı Döngüler
Ben kullanmayı kullanılan statik ilklendiriciler çok, ama bazen 2 sınıflar sınıf tamamen yüklenecek edemeden bloklar çağrılan başlatıcısı birbirlerinin statik bağlıydı döngüler koştu. Bu bir "sınıf yüklenemedi" veya benzer şekilde belirsiz bir hata mesajı üretti. Sorunun ne olduğunu anlamak için dosyaları kaynak kontrolünde bilinen en son çalışan sürümle karşılaştırmak zorunda kaldım. Hiç eğlenceli değil.
Tembel Başlatma
Statik başlatıcılar, çalışırken ve çok kafa karıştırıcı olmadıklarında performans nedenlerinden dolayı iyi olabilirler. Ama genel olarak, bugünlerde statik başlatıcılara tembel başlatmayı tercih ediyorum . Ne yaptıkları açık, onlarla henüz bir sınıf yükleme hatasıyla karşılaşmadım ve başlatıcı bloklarından daha fazla başlatma durumunda çalışıyorlar.
Veri Tanımı
Veri yapıları oluşturmak için statik başlatma yerine (diğer cevaplardaki örneklerle karşılaştır), şimdi kullanıyorum Paguro'nun değişmez veri tanımı yardımcı işlevlerini kullanıyorum :
private ImMap<String,String> days =
map(tup("mon", "monday"),
tup("tue", "tuesday"),
tup("wed", "wednesday"),
tup("thu", "thursday"),
tup("fri", "friday"),
tup("sat", "saturday"),
tup("sun", "sunday"));
Conculsion
Java'nın başlangıcında, bazı şeyleri yapmanın tek yolu başlatıcı bloklarıydı, ancak şimdi kafa karıştırıcı, hata eğilimli ve çoğu durumda daha iyi alternatiflerle değiştirildi (yukarıda detaylandırılmıştır). Onları eski kodda görmeniz durumunda başlatıcı blokları hakkında bilmek ilginç, ya da bir teste girdiler, ancak kod incelemesi yapıyordum ve yeni bir kodda birini gördüysem, neden hiçbirinin Yukarıdaki alternatifler, kodunuzu beğenmeden önce uygundur.