Bu, yukarıdaki cevaplarda daha önce bahsedilen iki nedeni özetleyen güzel bir makaledir :
- Güvenlik : sistem, değiştirileceklerinden endişe etmeden, salt okunur bilgilerin hassas parçalarını dağıtabilir
- Performans : değişmez veriler, işleri iş parçacığı açısından güvenli hale getirmek için çok yararlıdır.
Ve bu muhtemelen bu makaledeki en ayrıntılı yorumdur. Java ve güvenlik sorunları dize havuzu ile ilgisi vardır. Onun dize havuza ne karar vermek hakkında. Karakter dizileri aynı ise her iki dizenin de eşit olduğunu varsayarsak, oraya ilk kimin ve güvenlik sorunlarıyla birlikte geldiği konusunda bir yarış koşulumuz vardır. Değilse, dize havuzu yedek dizeler içerecek ve böylece ilk etapta sahip olma avantajını kaybedecektir. Sadece kendiniz okuyun, değil mi?
Dize genişletmek eşittir ve stajyer ile tahrip eder. JavaDoc diyor ki:
Bu dizeyi belirtilen nesneyle karşılaştırır. Sonuç, yalnızca bağımsız değişken null değilse ve bu nesneyle aynı karakter sırasını temsil eden bir String nesnesiyse doğrudur.
Varsayarak java.lang.String
bir nihai değildi SafeString
bir eşit olabilir String
, veya tam tersi; çünkü aynı karakter dizisini temsil ediyorlardı.
Uyguladığınız ne olur intern
a SafeString
- olur SafeString
JVM dize havuza gitmek? ClassLoader
Ve tüm nesneleri SafeString
sonra JVM ömrü boyunca yerinde kilitli alacağı için bekletilen başvurular. Bir dizi karakteri ilk kimin araya sokacağı konusunda bir yarış koşulu elde edersiniz - belki SafeString
de kazanırsınız, belki a String
, ya da belki SafeString
farklı bir sınıf yükleyici (böylece farklı bir sınıf) tarafından yüklenir.
Eğer havuza yarış kazanırsanız, bu gerçek bir singleton olacaktır ve insanlar tüm ortamınıza (sandbox) yansıma yoluyla erişebilir ve secretKey.intern().getClass().getClassLoader()
.
Veya JVM, havuza yalnızca somut String nesnelerinin (ve alt sınıfların) eklenmediğinden emin olarak bu deliği engelleyebilir.
Eğer eşitler uygulanmışsa SafeString
! = String
O zaman SafeString.intern
! = String.intern
Ve SafeString
havuza eklenmesi gerekir. Havuz daha sonra <Class, String>
bunun yerine bir havuz haline gelecek ve havuza <String>
girmek için ihtiyacınız olan her şey yeni bir sınıf yükleyici olacaktır.