"Neden Cloneable
itiraz edilmiyor ?" (ya da gerçekten, neden kimse için X
itiraz edilmiyor X
), onları itiraz etmeye çok dikkat edilmediğidir.
Son zamanlarda kullanımdan kaldırılan çoğu şey, kaldırılacak belirli bir plan olduğu için kullanımdan kaldırılmıştır. Örneğin, addPropertyChangeListener
ve removePropertyChangeListener
yöntemleri LogManager edildi Java SE 8 kullanımdan kaldırılmış Java SE 9. bunları kaldırarak niyetiyle (nedeni gereksiz yere modül bağımlılığını karmaşık olmasıdır.) Nitekim bu API'ler zaten edilmiştir erken JDK 9 kaldırıldı gelişme oluşturur. (Benzer özellik değişikliği dinleyici çağrılarının da kaldırıldığını unutmayın Pack200
; bkz. JDK-8029806 .)
Böyle benzer planı için için vardır Cloneable
ve Object.clone()
.
Daha uzun bir yanıt, bu API'lara ne olacağını umabileceğiniz, kullanımdan kaldırıldıklarında platforma hangi maliyetlerin veya avantajların tahakkuk edeceği ve bir API kullanımdan kaldırıldığında geliştiricilere ne iletileceği gibi başka soruların tartışılmasını içerecektir. Bu konuyu son JavaOne konuşmam, Borç ve Kullanım Dışı Bırakma'da araştırdım . (Slaytlar bu bağlantıda mevcut; video burada .) JDK'nın kullanımdan kaldırılmasında çok tutarlı olmadığı ortaya çıkıyor. Örneğin,
Bu tehlikelidir ve bunu kullanmanın risklerinin farkında olmalı (: örnek Thread.stop()
, Thread.resume()
ve Thread.suspend()
).
Bu, gelecekteki bir sürümde kaldırılacak
Bu kullanılmıyor ve farklı bir şey kullanmanız iyi bir fikir (örnek: içindeki yöntemlerin çoğu java.util.Date
)
Bunların hepsi farklı anlamlardır ve bunların farklı alt kümeleri, kullanımdan kaldırılan farklı şeyler için geçerlidir. Ve bunların bazı alt kümeleri, kullanımdan kaldırılmayan şeyler için geçerlidir (ancak bu, kullanımdan kaldırılmalıdır).
Cloneable
ve Object.clone()
tasarım kusurları olduğu ve doğru kullanılması zor olduğu için "kırılır". Bununla birlikte, clone()
hala dizileri kopyalamanın en iyi yoludur ve klonlamanın, dikkatlice uygulanan sınıf örneklerinin kopyalarını oluşturmak için bazı sınırlı faydaları vardır. Klonlamayı kaldırmak, birçok şeyi bozacak uyumsuz bir değişiklik olacaktır. Bir klonlama işlemi farklı bir şekilde yeniden uygulanabilir, ancak muhtemelen daha yavaş olacaktır Object.clone()
.
Bununla birlikte, çoğu şey için bir kopya oluşturucu klonlamaya tercih edilir. Bu nedenle, belki Cloneable
de "eski" veya "geçersiz" olarak işaretlemek veya benzer bir şey uygun olabilir. Bu, geliştiricilere muhtemelen başka bir yere bakmak istediklerini söyleyecektir, ancak klonlama mekanizmasının gelecekteki bir sürümde kaldırılabileceğini göstermez. Ne yazık ki, böyle bir işaretleyici yoktur.
Bazı şeyler durdukça, "kullanımdan kaldırılma", ortadan kaybolan az sayıdaki kullanımdan kaldırılmış özelliğin kaldırılmış olmasına rağmen, nihai olarak kaldırılması anlamına geliyor gibi görünüyor ve bu nedenle, klonlama mekanizması için kullanımdan kaldırılması gerekli görünmüyor. Belki de gelecekte geliştiricileri alternatif mekanizmalar kullanmaya yönlendiren alternatif bir işaret uygulanabilir.
GÜNCELLEME
Hata raporuna biraz ek geçmiş ekledim . JVM spesifikasyonunun erken JVM uygulayıcısı ve ortak yazarı Frank Yellin, diğer cevapta alıntılanan TRC önerisindeki "zaman sislerinde kayıp" yorumuna yanıt olarak bazı yorumlar yaptı . Burada ilgili bölümlerden alıntı yaptım; mesajın tamamı hata raporundadır.
Cloneable, Serializable ile aynı nedenden ötürü yöntem içermez. Cloneable, sınıfın desteklediği yöntemler hakkında özel bir şey söylemek yerine sınıfın bir özelliğini belirtir.
Yansımadan önce, bir Nesnenin sığ bir kopyasını oluşturmak için yerel bir yönteme ihtiyacımız vardı. Böylece Object.clone () doğdu. Ayrıca, birçok sınıfın bu yöntemi geçersiz kılmak isteyeceği ve her sınıfın klonlanmasını istemeyeceği açıktı. Bu nedenle Cloneable, programcının niyetini göstermek için doğdu.
Kısacası. Cloneable'un amacı, genel bir clone () yönteminiz olduğunu göstermek değildi. Object.clone () kullanarak klonlanmaya istekli olduğunuzu belirtmek içindi ve klon () 'u herkese açık hale getirip getirmeyeceğinize karar vermek uygulamaya bağlıydı.