Clonen



  • Hallo,

    ich habe in meiner Klasse die clone()-Methode implementiert.

    public class MeineKlasse extends JComponent implements Cloneable {
             private Polygon[] polygon;
    
    	public Object clone() {
    		try {
    			MeineKlasse cloned = (MeineKlasse) super.clone();
    			cloned.polygon = (Polygon[]) polygon.clone();
    			return cloned;
    		} catch(Exception e) {
    			throw new InternalError(e.toString());
    		}
    	}
    }
    

    später klone ich ein Objekt der Klasse "MeineKlasse" in einer Schleife:

    //for-Schleife
    
    MeineKlasse cloned = (MeineKlasse) ((MeineKlasse) components[i]).clone();
    Polygon[] cPolygon = cloned.getPolygons();
    for(int j=0; j< cPolygon.length; j++) {
    	cPolygon[j].translate(10,10);
    }
    

    Leider wird die Methode translate an dem "Original"-Objekt aufgerufen (dadurch, dass ich die "Original"-Polygone zeichne, merke ich dann, dass sie sich verschieben).

    Habe ich mit

    cloned.polygon = (Polygon[]) polygon.clone();
    

    nicht eine Array-Kopie erstellt ?

    danke
    kati



  • Mit dieser Anweisung

    cloned.polygon = (Polygon[]) polygon.clone();
    

    hast du nur das Array als ein Object kloniert (flacher Klone (engl. shallow clone) des Arrays). Nicht seine Elemente.
    Wenn du auch die Elemente des Arrays klonieren willst, dann

    cloned.polygon = new Polygon[polygon.length];
    for(int i = 0; i < polygon.length; ++i)
        cloned.polygon[i] = (Polygon)polygon[i].clone();
    

    ist das richtige Herangehens (tiefer Klone des Arrays (engl. deep clone) ) bei der Lösung des Problems.



  • hallo,

    ich dachte, das könnte ich mir sparen. Dann muss ich ja eine Methode schreiben, die mir einfach alles kopiert.


Anmelden zum Antworten