2013-07-31 31 views
7

Her zaman clone()'un bir kurucu çağırmadan bir nesne oluşturduğunu düşündüm. Kurucu kullanılarak nesne oluşturma yöntemi klonlanabilir

Ama Etkili Java Ürün 11 okurken: mantıklı geçersiz kıl klonu, ben

“hayır kurucular denir” bu hüküm çok güçlü olduğunu söyleyen bir açıklamada bulundu. Bir iyi huylu klon yöntemi, yapım aşamasında olan klonun içinde objeleri oluşturmak için kurucuları arayabilir. Sınıf final ise, klonu, bir kurucu tarafından oluşturulan bir nesneyi bile döndürebilir.

Birisi bunu bana açıklayabilir mi?

+1

'klonlama() yöntemi yapıcıyı çağırmaz, varsayılan davranışı sığ kopya gerçekleştirir. ancak eğer derin bir kopya yapmak istiyorsak, yeni Nesne'ye dönebileceğimiz 'clone()' yöntemini geçersiz kılmamız gerekir. – swapy

cevap

12

Her zaman clone(), bir kurucu çağırmadan bir nesne oluşturduğunu düşündüm.

Object.clone()'daki uygulama yapıcı çağırmaz.

Bunu sizin yaptığınız şekilde uygulamanızın engelleneceği hiçbir şey yoktur. sınıf final ise o zaman orijinaliyle aynı türde bir nesne iade etmek garanti edemez çünkü

public final class Foo implements Cloneable { 
    private final int bar; 

    public Foo(int bar) { 
     this.bar = bar; 
    } 

    @Override 
    public Object clone() { 
     return new Foo(bar); 
    } 
} 

Yalnızca, (kayıtsız şartsız) bunu yapabilirsiniz: Örneğin, bu mükemmel geçerli clone() uygulamasıdır. sınıfı son değilse

, Sanırım olabilir örneği ... bunu yapmak için tek olacağını "sadece" türünde bir örneği clone() geçersiz kılma ve farklı durumlarda farklı idare olup olmadığını onay gerçi.

+0

Neden sadece ders final ise bunu yapabilirim? Bunu final olmayan sınıfta yaparsam, herhangi bir etki olacak mı? – Anand

+2

@Anand: 'clone()', orijinaliyle aynı türde bir örnek döndürmelidir. Eğer sınıf final olmayan ise, “bunun” bir alt sınıfın örneğine başvurması olasılığını göz önünde bulundurmalısınız. –

İlgili konular