Nasıl düzgün klon yöntemi geçersiz kılmak için?
Hayır üst sınıf olan bu nesnelerden birini derin bir klon uygulamaya ihtiyacım var.
CloneNotSupportedException
işaretli üst sınıf Object
() tarafından atılan işlemek için en iyi yolu nedir?
Bir iş arkadaşım bana aşağıdaki şekilde işlemek için tavsiye:
@Override
public MyObject clone()
{
MyObject foo;
try
{
foo = (MyObject) super.clone();
}
catch (CloneNotSupportedException e)
{
throw new Error();
}
// Deep clone member fields here
return foo;
}
Bu bana iyi bir çözüm gibi görünüyor, ama StackOverflow topluluk varsa dahil olabilirim başka bir tahminin olup olmadığını görmek için atmak istedim. Teşekkürler!
CEVAP
Kesinlikle clone
kullanmak gerekir mi? Çoğu kişi Java clone
kırık olduğunu kabul ediyorsunuz.
Josh Bloch on Design - Copy Constructor versus Cloning
Eğer satır aralarını özellikle eğer okursanız benim kitabımda klonlama, ilgili maddenin okuduysanız
clone
derin bir kırık olduğunu düşünüyorum. [ ... ]Cloneable
kırılmış bir şey, ama oluyor.
Kitabında bu konu hakkında daha fazla tartışma okuyabilirsinizEtkili Java 2. Baskı, Madde 11: clone
dikkatli Geçersiz kılar. Bunun yerine bir kopya oluşturucu kullanın veya fabrika kopyalamak için öneriyor.
Üzerinde, eğer gerektiğini düşünüyorsanız, clone
uygulamak nasıl sayfa sayfa yazmaya başladı. Ama bu o kapalı:
Tüm bu karmaşıklığı gerçekten gerekli mi? Nadiren. Eğer
Cloneable
, uygulayan bir sınıf genişletmek ama terbiyeliclone
bir yöntemi uygulamak için küçük bir seçim var. Aksi takdirdekopyalama nesne, ya da sadece bu özelliği veren değil, başka yollarla sağlamak daha iyidir.
Vurgu onun, benim değil.
Çok az seçenek var ama clone
burada uygulamak için bu durumda ne yapacağını çok açık bir şekilde söylemiştin beri: MyObject extends java.lang.Object implements java.lang.Cloneable
emin olun. Eğer durum buysa, o zaman garanti edemezASLACloneNotSupportedException
yakalamak. Bazı ileri sürüldüğü gibi AssertionError
atma makul görünüyor, ama aynı zamanda catch bloğu asla girilir neden açıklayan bir açıklama ekleyebilirsinizbu özel durumda.
Diğerleri de gösterdiği üzere, alternatif olarak, belki de super.clone
aramadan clone
uygulayabilirsiniz.
Nasıl düzgün HTML5 bir Önbellek çevrim...
Nasıl Omurga geçersiz kılmak için.sync...
&Quot Geçersiz kılmak İçin Nasıl Andro...
Raylar üzerinde Ruby belirleyici bir y...
Nasıl Raylar to_json geçersiz kılmak i...