2016-04-01 18 views
0

, başlatılıyor Alanlar (vurgu benim): Her yapıcı içineNeden örnek başlatıcı bloğu içinde son alanları kullanamıyorum? Oracle'ın <a href="https://docs.oracle.com/javase/tutorial/java/javaOO/initial.html" rel="nofollow">guide</a> itibaren

Java derleyici kopya başlatıcısı blokları. Bu nedenle, bu yaklaşım çoklu kurucular arasında bir kod bloğunu paylaşmak için kullanılabilir. Ayrıca

gelen DOJ en article Java örneği başlatıcıları (vurgu benim) hakkında:

Örnek başlatma blok kodu, diğer bir deyişle, doğru bir yapıcı içinde süper() çağrısının ardından ishal sonra Tüm süper kurucular'u çalıştırdılar.

Bunu göz önünde bulundurduğumda, derleyici, aşağıdaki gibi başlatıcı blok içerisindeki (atanan) son alanları kullanmaya çalıştığımda neden her zaman uyarır?

final class PpTitleBook implements TitleBook { 
    private final Resources resources; 
    private final Log log; 

    PpTitleBook(Resources resources, Log log) { 
    this.resources = resources; 
    this.log = log; 
    } 

    { 
    String[] resTitles = resources.getStringArray(R.array.titles); 

    if (book().getAllKeys().isEmpty()) { 
     for (int i = 0; i < resTitles.length; i++) { 
     newTitle(resTitles[i]); 
     } 
    } 
    } 

Yukarıda gösterilenlerden başka başka bir yapıcım yok. Peki uyarının arkasındaki gerçek sebep nedir?

+3

Yanıt şu soruya cevap veriyor: * Örnek başlatma bloğu kodu, kurucudaki * (superm) çağrısından hemen sonra çalışır, böylece kurucunun kalan kodu, son alanı başlatmadan önce yürütülür. Ve bu da uyarı mesajının da söylediği şey. –

+0

Ayrıca bkz. Http://stackoverflow.com/questions/20593606/how-non-static-initializer-block-invoked?rq=1 (soru kötüyse de, yanıtlar iyi) –

cevap

5

Örnek başlatıcı bloğu kodu yapıcının kodundan önce yürütülür; bu nedenle, resources değişkeniniz, örnek başlatıcı bloğu tarafından kullanılmadan önce başlatılmaz.

Yalnızca bir kurucunuz olduğundan, örnek başlatıcı bloğunun kodunu yapıcıya taşıyabilirsiniz.

+0

" Oracle'ın dokümanlarında "başlatıcı bloklarını her kurucuya kopyalar." Oh, ve eskiden söz konusu sınıfta birden fazla memur vardı. Refactoring sürecindeyim ve bu olay benim merakımı vurdu. Teşekkürler. – ridsatrio

+0

@ridsatrio Rica ederim – Eran