SORU
10 Mayıs 2011, Salı


java: "son" Sistemi.dışarı, Sistemi.ve Sistem.err?

System.out public static final PrintStream out olarak ilan edilmiştir.

Ama System.setOut() yeniden atama için arayabilirsiniz.

Değil mi? Nasıl olursa final Eğer bu mümkün müdür?

(aynı nokta System.in System.err için geçerlidir)

Ve eğer son kamu alanları statik mutasyona eğer daha da önemlisi, ne bu final sana verdiği kadarıyla garanti (varsa) anlamına mı geliyor? (Ben hiç farketmemiştim, ne de Sistem bekleniyor.dışarı//final değişkenler) gibi davrandım hata

CEVAP
10 Mayıs 2011, Salı


JLS 17.5.4 Write Protected Fields:

Normalde, son statik alanlar değiştirilemez. Ancak System.in, System.out System.err final static alanlar, eski nedenler olmalı hakkı verilerek değiştirilmiştir yöntemleri System.setIn, System.setOut System.setErr. Olarak bu alanlara bakınyazma korumalısıradan son alanları ayırmak için.

Derleyici bu alanlar farklı diğer final alanlardan tedavi etmesi gerek. Örneğin, sıradan bir final alan bir okuma" için senkronizasyon: bariyer kilit ya da uçucu bir okuma dahil son bir alan. okunur etkiler yok "bağışıklık Yazma korumalı alan değerini değiştirmek için olabilir bu yana, eşitleme olayları üzerinde bir etkiye sahip olmalıdır. Bu nedenle, anlambilim bu alanlar kullanıcı kodu System sınıfta olmadığı sürece, kullanıcı kodu tarafından değiştirilemez normal alanlar gibi muamele ediyordu.

Bu arada, aslında onlara setAccessible(true) (ya da Unsafe yöntemler kullanarak) çağırarak yansıma) final alanlar mutasyona edebilirsiniz. Bu tür teknikler kullanılır seri kaldırma sırasında, Hazırda bekleme ve diğer çerçeveler, vb, ama onlar bir sınırlama: kod gördük değeri son alan değişikliği önce değil garantili görmeye değer sonra yeni bir değişiklik. Söz konusu alanları özel derleyici tarafından özel bir şekilde tedavi oldukları için bu sınırlama serbest olmasıdır.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • iNCH

    iNCH

    20 Temmuz 2009
  • MrMimoB

    MrMimoB

    11 NİSAN 2011
  • xSammyJoe1

    xSammyJoe1

    19 Temmuz 2011