SORU
13 Aralık 2012, PERŞEMBE


Başlatılmamış son alan - 'bu olmadan/ile kullanın.' niteleyici

Birisi aşağıdaki iki örnek birinci ikinci yok derler, neden bana açıklayabilir mi? İlki açıkça x başvurusunu niteleyen tek fark '.dikkat edin.bu', ikinci ise yok. Her iki durumda da, nihai alan x açık başlatıldı başlamadan önce denenir.

Her iki örneği de tamamen eşit, hem de derleme bir hata sonucu ele alınacağını düşünmüştüm.

1)

public class Foo {
    private final int x;
    private Foo() {
        int y = 2 * this.x;
        x = 5;
    }
}

2)

public class Foo {
    private final int x;
    private Foo() {
        int y = 2 * x;
        x = 5;
    }
}

CEVAP
13 Aralık 2012, PERŞEMBE


Spec-okuma ve düşünce bir sürü sonra, sonucuna vardım:

Java 5 veya 6 Java derleyici, bu doğru bir davranıştır. Chapter 16 "Definite Assignment of The Java Language Specification, Third Edition diyor ki:

Her yerel değişken (§14.4) final (§4.12.4) her boş alan (§8.3.1.2) olması gerekirkesinlikle atanmışdeğeri olan herhangi bir erişim oluştuğunda değer. Değeri için bir erişim oluşurdeğişken basit adıherhangi bir ifade içinde basit atama operatörü sol işlenen olarak dışında meydana gelen 5**.

(vurgu benim). Deyim 2 * this.x, this.x parçasıdırdeğilkabul, bir "erişim [x's] değeri" (ve bu nedenle tabi olmayan kurallar kesin atama), çünkü this.x değil basit adı örnek değişken x. (N. B. yukarıda alıntılanan metni sonra paragrafta kesin atama oluştuğunda kuralı,yok12* *this.x = 3 ve düşünür gibi bir şey kesinlikle bundan sonra atanmak için izin ver; sadece sayılmaz eriştiği için kural this.x.) Bu durumda this.x değeri sıfır, §17.5.2 başına olacağını unutmayın.

Java 7, derleyici, derleyici bir hata, ama anlaşılabilir. Chapter 16 "Definite Assignment" of the Java Language Specification, Java 7 SE Edition diyor ki:

Her yerel değişken (§14.4) ve final her boş alan (§4.12.4, §8.3.1.2) olmalıdırkesinlikle atanmışdeğeri olan herhangi bir erişim oluştuğunda değer.

Değeri için bir erişim değişken basit adı oluşur(ya da, bir alan için, alan this kalifiye basit adı)meydana gelen bir deyim içinde herhangi bir yere basit atama operatörü = (§15.26.1)sol işlenen olarak hariç.

(vurgu benim). İfadesinde 18**, this.x bölümügerekirkabul edilebilir bir "erişim [x's] değeri", vegerekirbir derleme hatası verir.

Ama sormadınolsunilkigerekirderleme, seni sordunedenyokderleme (bazı derleyici). Bu mutlaka spekülatif, ama iki tahmin yapacağım:

  1. En 7 Derleyiciler Java 6 Derleyiciler değiştirerek yazılmış Java. Bazı derleyici yazarlar bu değişiklik fark olmayabilir. Ayrıca, birçok Java-7 derleyici ve IDE hala destek Java 6 ve bazı derleyicisi-yazar olmayabilir hissettim motive etmek için özel olarak reddetmek bir şey Java-7 mod kabul ediliyor Java-6 mod.
  2. Yeni Java 7 davranış garip tutarsız. Bir şey gibi (false ? null : this).x hala izin, ve hatta, bile (this).x hala izin; sadece belirli belirteç sırası this artı . artı alan-adı bu etkilenen tarafından bu değişiklik. Kabul ediyorum, böyle bir tutarsızlık zaten var, sol tarafında bir atama deyimi (yazabiliriz this.x = 3 ama (this).x = 3), ama bu daha kolay anlaşılabilir: bu kabul this.x = 3 gibi özel bir izin verilen davanın aksi halde yasak inşaat obj.x = 3. His buna izin yapar. Ama sanmıyorum o kadar anlamlı reddetme 2 * this.x gibi özel bir yasak davanın aksi takdirde izin verilen inşaat 2 * obj.x, verilen (1) Bu özel yasak durumda kolayca çalıştı ekleyerek parantez, (2) Bu özel yasak böyleydi izin önceki sürümlerinde, Dil, ve (3) biz hala gereken özel bir kural mademki final alanları varsayılan değerlerine (örneğin 0 int) kadar onlar başlatıldı, foo() * * * * this.foo() gibi durumlarda (this).x gibi durumlar yüzünden hem ve değildir x erişen bir yöntem. Derleyici yazarlar bu tutarsız değişiklik yapmak için motive hissettim olmayabilir.

Ya da bu şaşırtıcı olurdu-sanırım bu derleyici-yazarlar vardı ile ilgili detaylı bilgilere her değişiklikle spec, ve benim deneyim Java derleyicileri genellikle çok iyi olmuş bir kere spec tam olarak (aksine bazı dillerde, her derleyici kendi lehçesi) - ama, Pekibir şeyoldu, ve yukarıda sadece iki tahmin hakkı vardır.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • 1881 Animation

    1881 Animati

    5 EKİM 2013
  • Ludique

    Ludique

    21 NİSAN 2009
  • Truc Minh

    Truc Minh

    23 Ocak 2011