2012-11-15 29 views
5

Aniden, Java'da derin bir polimorfik kopya oluşturma sorunuyla karşılaştım. Uygulanabilirlik Clonable, sorunu benim durumumda çözer, ancak genellikle "kötü" bir teknik olarak adlandırılır. kullanılarakJava'da polimorfik kopya Java'da

com.xxx.zzz.Parent, 5 
com.xxx.zzz.Child, 10,20 
com.xxx.zzz.Parent, 5 
com.xxx.zzz.Child, 10,20 

Ve aynı şeyi başka (kısa) yolu (:

public class Parent { 
    int x; 

    public Parent() {} 

    public Parent(int x0) { 
     x = x0; 
    } 

    public Parent copy() { 
     Parent b = new Parent(); 
     b.assign(this); 

     return b; 
    } 

    protected void assign(Parent c) { 
     x = c.x; 
    } 

    @Override 
    public String toString() { 
     return getClass().getName() + ", " + x; 
    } 
} 

public class Child extends Parent { 
    int y; 

    protected Child() {} 

    public Child(int x0, int y0) { 
     super(x0); 
     y = y0; 
    } 

    @Override 
    public Child copy() { 
     Child b = new Child(); 
     b.assign(this); 

     return b; 
    } 

    @Override 
    protected void assign(Child c) { 
     super.assign(c); 
     y = c.y; 
    } 

    @Override 
    public String toString() { 
     return getClass().getName() + ", " + x + "," + y; 
    } 
} 

public class Test { 
    public static void main(String[] args) { 
     Parent x = new Parent(5); 
     Child y = new Child(10, 20); 
     Parent z = x.copy(); 
     Parent w = y.copy(); 

     System.out.println(x); 
     System.out.println(y); 
     System.out.println(z); 
     System.out.println(w); 
    } 
} 

çıktısı:

Yani, burada bir "hayır-Clonable" çözüm bulmak için benim çabalarıdır Yansıma): Child sınıfında copy() öğesini geçersiz kılmaya gerek yoktur. Ama bir kopya yer tutucu oluşturmak için getClass(). NewInstance() kullanmak için nasıl 'yasal' emin değilim ...

Yukarıdaki çözümlerin kullanılması değer mi yoksa daha yaygın/sağlam/basit yaklaşımlar var mı?

Teşekkür ederiz!

+0

'Child', varsayılan bir yapıcı varsa bu işe yaramaz. –

cevap

2

Çözümün bu özel kullanım durumu için, bana normal görünüyor. nihai alanları sahip nesneleri klonlamak mümkün olacağını sadece bir no-arg yapıcı olması nesnelerle çalışır

  • ve
  • :

    newInstance() kullanmanın temel sınırlamalar

    ki vardır

Klonlamayı destekleyen bazı kütüphaneler vardır. Kryo'a bir göz atın. Ayrıca, argüman içermeyen veya son alanları olan nesneler dahil olmak üzere klonlamayı (derin ve sığ) destekleyen bir serileştirme kütüphanesidir.

0

"clone()" yaklaşımının büyük bir hayranı olmadım.

Parent p = new Parent(new Child(...)); 

Elbette bu davranışı engelleyebilir: Kopyala kurucular IMO daha şık görünmektedir: Eğer gerekiyorsa

public class Parent { 
    int x; 

    public Parent() { 
     super(); 
    } 

    public Parent(Parent other) { 
     super(); 
     this.x = other.x; 
    } 
} 

public class Child extends Parent { 
    int y; 

    public Child() { 
     super(); 
    } 

    public Child(Child other) { 
     super(other); 
     this.y = other.y; 
    } 
} 

Not, bu da bunu yapmak mümkün olmanın yararı vardır argüman sınıf tipini kontrol ederek yapıcı, ancak çoğu durumda neden ihtiyacım olduğunu görmüyorum.

+1

Sorun, kopya yapıcıların polimorfizmle düzgün bir şekilde ilgilenmemesidir. – user671786

İlgili konular