2012-05-02 22 views
5

Java'da konu kavramı ile uğraşırken Thread.java kaynak dosyasını gördüm. setName() yöntemi, "name[]" adlı bir karakter dizisine dize atarken farkettim. Java'nın bir String veri türü özelliği var, o zaman neden karakter dizisi kullanıyorlar. o gibi bir sıfırlanır kaynak dosyasındaNeden setName Thread sınıfında bir karakter dizisine atar? Neden bir String değil?

, setName() yöntemde

private char name[]; // why not "private String name;" 

,

public final void setName(String name) { 
    checkAccess(); 
    this.name = name.toCharArray(); 
    } 

bana yardım edin. Şimdiden teşekkürler.

cevap

9

Bu ada yerel koddan erişilir, bu nedenle Java dizileriyle karıştırmaktan çok char dizileri işlemek daha kolaydır. core-lib-devs posta listesi bu soruyu bir süre önce tartıştı, işte bundan bir link iş parçacığından bir posta. Özgün soru, "Önemli bir kısmın, yeni char tahsisi ve kopya char dizisi vb. Yapılması gerektiğine inandığım Thread.setName çağrısına giderken,". cevap bitlerini alıntı: Bu şekilde bir RFE 2002 sonlarında geri vardı

:

4745629 (thread) Thread.setName yapar gereksiz dize tahsisleri (karbonlaşmış [] kullanmayın)

2002 yılında ilk eval belirtti:

"Ben düşünemiyorum bu ciddi etkiler herhangi gerçek programın performansı Ayrıca, Konu alanları değişen nedeniyle yakın ilişkisi sorunlu olduğunu. VM ile bu sınıfın gemisi. . ":

'adını bağımlılıkları vardır bazı Konu kod temizleme bağlamında bu adresleme değerinde olabilir düzeltmek olmaz' o kadar kapatıldı 2005 yılında Sonra

" dedi That temsil JVM bir karakter dizisi olmak ve bu RFE saygıyla reddedilmelidir "

+2

Bunu bir referansla veya başka bir şeyle destekleyebilir misiniz? "Yerel" ağacında "Thread.java" veya "Thread.c" öğelerinde hiçbir şey görmüyorum. Bu, adı yerel koda erişilebilir hale getiriyor. Yerel koddan erişilmiş olsaydı, sonunda boş bir karakter görmeyi beklerdim. Bu spekülasyon gibi görünüyor. –

+0

Bu harika bir cevaptı, teşekkür ederim. düşünebilir miyim, bu nedenlerden biri, java saf nesne yönelimli dil değil mi? – kik

+1

@kik: ** tüm ** "Java bir saf OO dili" sorusu ** yararsızdır ** çünkü hiç kimsenin "saf OO dili" ni tam olarak neyin yaptığıyla ilgili yararlı bir tanım sağlayamadığı için. Yanlış olduğunu kanıtlamak isterdim, ama şimdiye kadar olmadı. –

4

Bu büyük olasılıkla bir tarihi eser olduğunu düşünüyorum;. yani şey artık nedenlerle uzun zaman önce yapıldı ilgili

Curtisk'in yorumunda belirtildiği gibi, bunun düzeltilmesi önerilmiştir. Ancak fikrin bir tarafa yerleştirilmiş olması gibi bir fikre sahip olduğu için, fikrin faydasını aşması gayreti. Ve bu anomoliyi tamir etmenin yararının çok az olduğu açıktır ... çok az iş yapan çok fazla iş parçacığı yaratmıyorsanız.

RFE (4.745.629) artık Google'a görülebilir, fakat Oracle @ David Holmes tarafından this mailing list posting kendisine atıfta bulunmaktadır:

:

Xiaobin Lu 08/11/10 08:07 aşağıdaki bahsedilen

Cevabınız için teşekkür ederiz. Çok sayıda kurumsal uygulama için (örneğin, çalışıyorum ), bu iş parçacığına adil bir süre gider.setName çağrı önemli bir kısmı yeni char ayırma ve kopya char dizisi vb yapmaktır inanıyorum. Bu yüzden bu alanı verimli bir şekilde nasıl saklayabileceğimize dair ikinci bir düşünce vermeliyiz diye düşünüyorum. Bu şekilde bir RFE 2002 sonlarında geri

vardı:

4745629 (thread) Thread.setName gereksiz dize tahsisleri ilk eval

(değil kullanım kömürü [] do) yapar 2002 yılında belirtti.

"Bu ciddi etkiler herhangi bir gerçek programın performansı Ayrıca, Konu alanları değişen nedeniyle t ile bu sınıfın yakın ilişkisine sorunlu olduğunu hayal bile edemiyorum o VM. Yani bazı Konu kod temizleme bağlamında bu adresleme değerinde olabilir dedi düzeltmek olmaz "

Ardından 2005 yılında o kadar kapatıldı '':

" adı temsiline bağımlılıkları vardır VM ve bildiğiniz gibi, için gerçek bir ağrı koordinat Java kodunu hem değiştirme ". bir karakter dizisi JVM ve bu RFE saygıyla reddedilmelidir


olmak, yani orada olurdu bazı zorlayıcı performans kanıtı olmak Bunu port edin (değiştirilebileceğini varsayarak). Kişisel olarak ben yukarıdaki ilk değerlendirmeyi kabul ediyorum - setName genel performansını etkiliyorsa, iş parçanız çok fazla iş yapmıyor olabilir ve çok fazla iş parçacığı yaratıyor gibi görünebilir - Burada bunun gerçekleştiği bağlam hakkında daha fazla bilgi.

İlgili konular