SORU
24 ŞUBAT 2010, ÇARŞAMBA


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
24 ŞUBAT 2010, ÇARŞAMBA


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 terbiyeli clone 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.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Bokeh

    Bokeh

    9 HAZİRAN 2014
  • Joseph Herscher

    Joseph Hersc

    14 Mart 2007
  • Noam Erez

    Noam Erez

    3 NİSAN 2012