Değişmezler – Blog Yazma – Web Tasarımı Yapımı – Web Tasarımı YouTube Videosu Yapımı – Web Sitesi Tasarlama Fiyatları
Değişmezler
Bir önceki yazımızda yer alan period örneği, değişmezleri bozulmadan yaratılmış olsa da, dahili bileşenlerini istediğiniz zaman değiştirmek mümkündür. Değişken bir Period örneğine sahip olan bir saldırgan, örneği güvenliği için Period’un değişmezliğine bağlı olan bir sınıfa geçirerek büyük zarara neden olabilir. Bu o kadar da abartılı değil: Güvenlikleri için String’in değişmezliğine bağlı olan sınıflar var.
Sorunun kaynağı, Period’un readObject yönteminin yeterince savunma amaçlı kopyalama yapmamasıdır. Bir nesnenin serisi kaldırıldığında, bir istemcinin sahip olmaması gereken bir nesne referansını içeren herhangi bir alanı savunma amaçlı olarak kopyalamak çok önemlidir.
Bu nedenle, özel değiştirilebilir bileşenler içeren her seri hale getirilebilir değişmez sınıf, bu bileşenleri savunma amaçlı olarak readObject yönteminde kopyalamalıdır. Aşağıdaki readObject yöntemi, Period’un değişmezlerini sağlamak ve değişmezliğini korumak için yeterlidir.
Savunma kopyasının geçerlilik kontrolünden önce yapıldığını ve savunma kopyasını gerçekleştirmek için Date’in klon yöntemini kullanmadığımızı unutmayın. Bu ayrıntıların her ikisi de Period’u saldırılara karşı korumak için gereklidir.
Ayrıca, son alanlar için savunma amaçlı kopyalamanın mümkün olmadığını unutmayın. readObject yöntemini kullanmak için başlangıç ve bitiş alanlarını nihai olmayan hale getirmeliyiz. Bu talihsiz bir durum, ancak açıkça iki kötülükten daha azı. Yeni readObject yöntemi yerindeyken ve başlangıç ve bitiş alanlarından son değiştirici kaldırıldığında, MutablePeriod sınıfı etkisiz hale getirilir. Yukarıdaki saldırı programı şimdi bu çıktıyı üretir.
Varsayılan readObject yönteminin kabul edilebilir olup olmadığına karar vermek için basit bir turnusol testi vardır. Nesnenizdeki her geçici olmayan alanın değerlerini parametre olarak alan ve hiçbir doğrulama olmaksızın alanlardaki değerleri depolayan bir ortak kurucu eklemekte kendinizi rahat hisseder miydiniz?
Bu soruya evet yanıtı veremiyorsanız, o zaman açık bir readObject yöntemi sağlamalısınız ve bir kurucu için gerekli olacak tüm geçerlilik denetimi ve savunma kopyalamasını gerçekleştirmelidir.
Nihai olmayan serileştirilebilir sınıflarla ilgili olarak readObject yöntemleri ve yapıcılar arasında bir başka benzerlik daha vardır. Bir readObject yöntemi, doğrudan veya dolaylı olarak geçersiz kılınabilir bir yöntemi çağırmamalıdır. Bu kural ihlal edilirse ve yöntem geçersiz kılınırsa, geçersiz kılma yöntemi, alt sınıfın durumu seri durumdan çıkarılmadan önce çalışır. Bir program hatasının ortaya çıkması muhtemeldir.
Özetlemek gerekirse, herhangi bir readObject yöntemi yazdığınızda, hangi bayt akışının verildiğinden bağımsız olarak geçerli bir örnek üretmesi gereken bir genel kurucu yazdığınız zihniyetini benimseyin.
Bayt akışının gerçek bir serileştirilmiş örneği temsil ettiğini varsaymayın. Bu öğedeki örnekler, varsayılan serileştirilmiş formu kullanan bir sınıfla ilgili olsa da, ortaya çıkan tüm sorunlar, özel serileştirilmiş formlara sahip sınıflara eşit olarak uygulanır.
Burada, kurşun geçirmez bir readObject yöntemi yazmak için özet olarak yönergeler verilmiştir:
- Özel kalması gereken nesne referans alanlarına sahip sınıflar için, böyle bir alanda depolanacak her nesneyi savunma amaçlı kopyalayın.
- Değişmez sınıfların değişken bileşenleri bu kategoriye girer.
- Değişmezleri olan sınıflar için, değişmezleri kontrol edin ve bir kontrol başarısız olursa bir InvalidObjectException atın. Kontroller, herhangi bir savunma amaçlı kopyalamayı takip etmelidir.
- Tüm bir nesne grafiğinin seri durumdan çıkarıldıktan sonra doğrulanması gerekiyorsa, ObjectInputValidation arabirimi kullanılmalıdır. Bu arayüzün kullanımı bu çalışmanın kapsamı dışındadır.
- Sınıfta doğrudan veya dolaylı olarak geçersiz kılınabilir yöntemleri çağırmayın.
Read Resolve yöntemi, savunma amaçlı bir readObject yöntemine alternatif olarak kullanılabilir. Bu alternatif tartışılıyor.
Java immutable Nedir
JavaScript immutability
Java String immutable
String neden immutable
Mutable immutable JavaScript
İmmutable ne demek
Encapsulation Nedir
Mutable immutable Java Nedir
Okuma Çözümü Yöntemi
Singleton modelini açıklar ve aşağıdaki singleton sınıfı örneğini verir. Bu sınıf, yalnızca tek bir örneğin oluşturulmasını sağlamak için yapıcısına erişimi kısıtlar.
Belirtildiği gibi, bildirimine “Uygulamalar Serileştirilebilir” kelimeleri eklenirse, bu sınıf artık bir tekil olmayacaktı. Sınıfın varsayılan serileştirilmiş formu mu yoksa özel serileştirilmiş formu mu kullandığı veya sınıfın açık bir readObject yöntemi sağlayıp sağlamadığı önemli değildir.
Herhangi bir readObject yöntemi, ister açık ister varsayılan olsun, yeni oluşturulan bir örneği döndürür; bu, sınıf başlatma zamanında oluşturulanla aynı örnek olmayacaktır. 1.2 sürümünden önce, seri hale getirilebilir bir singleton sınıfı yazmak imkansızdı.
1.2 sürümünde, serileştirme tesisine readResolve özelliği eklendi. Seri durumdan çıkarılan bir nesnenin sınıfı, uygun bildirime sahip bir readResolve yöntemi tanımlarsa, bu yöntem, seri durumdan çıkarıldıktan sonra yeni oluşturulan nesnede çağrılır.
Bu yöntem tarafından döndürülen nesne başvurusu, daha sonra yeni oluşturulan nesnenin yerine döndürülür. Bu özelliğin çoğu kullanımında, yeni oluşturulan nesneye hiçbir referans tutulmaz; nesne fiilen ölü doğar ve hemen çöp toplamaya uygun hale gelir. Elvis sınıfı Serileştirilebilir’i uygulamak için yapılmışsa, aşağıdaki readResolve yöntemi singleton özelliğini garanti etmek için yeterlidir.
Bu yöntem, seri durumdan çıkarılmış nesneyi yok sayar, yalnızca sınıf başlatıldığında oluşturulan seçkin Elvis örneğini döndürür. Bu nedenle, bir Elvis örneğinin serileştirilmiş formunun herhangi bir gerçek veri içermesi gerekmez; tüm örnek alanları geçici olarak işaretlenmelidir. Bu sadece Elvis için değil, tüm singletonlar için geçerlidir.
Bir readResolve yöntemi yalnızca tekiller için değil, diğer tüm örnek kontrollü sınıflar için, başka bir deyişle, bazı değişmezleri korumak için örnek oluşturmayı sıkı bir şekilde kontrol eden tüm sınıflar için gereklidir.
Örnek denetimli sınıfın başka bir örneği, readResolve yönteminin belirtilen numaralandırma sabitini temsil eden kurallı örneği döndürmesi gereken bir tür güvenli numaralandırmadır. Genel bir kural olarak, genel veya korumalı oluşturucu içermeyen serileştirilebilir bir sınıf yazıyorsanız, bunun bir readResolve yöntemi gerektirip gerektirmediğini düşünün.
ReadResolve yöntemi için ikinci bir kullanım, Madde 56’da önerilen savunma amaçlı readObject yöntemine muhafazakar bir alternatiftir. Bu yaklaşımda, tüm geçerlilik kontrolleri ve savunma amaçlı kopyalama, bir normal kurucu. Varsayılan serileştirilmiş form kullanılırsa, readObject yöntemi tamamen ortadan kaldırılabilir.
Açıklandığı gibi, bu, kötü niyetli bir istemcinin güvenliği ihlal edilmiş değişmezlerle bir örnek oluşturmasına olanak tanır. Ancak, potansiyel olarak güvenliği ihlal edilmiş seri durumdan çıkarılmış örnek hiçbir zaman etkin hizmete alınmaz; genel bir kurucuya veya statik fabrikaya girdiler için basitçe çıkarılır ve atılır.
Bu yaklaşımın güzelliği, serileştirmenin dil dışı bileşenini neredeyse ortadan kaldırarak, sınıf serileştirilebilir hale getirilmeden önce mevcut olan herhangi bir sınıf değişmezini ihlal etmeyi imkansız hale getirmesidir. Bu tekniği somut hale getirmek için, Period örneğinde savunma amaçlı readObject yöntemi yerine aşağıdaki readResolve yöntemi kullanılabilir.
Web sitelerinizi, arama motorlarında en yukarı getirmek adına sizlere 3 adet paket öneriyoruz. Bu paketler sayesinde web siteleriniz aramalarda 1 yıl içerisinde en yukarıya tırmanacaktır.
1) Backlink Paketi 50 $ (Yıllık Ücret)
2) Hızlandırma Paketi 300 $ (Yıllık Ücret)
3) Kelime Yönlendirme Paketi 150 $ (Aylık Ücret)