Object clonen spezial

Status
Nicht offen für weitere Antworten.

reibi

Top Contributor
Hallo zusammen

Wie man ein Objekt clont ist ja überall gut beschrieben. Offensichtlich fünktioniert das bei allen auch gut, nur bei mir nicht. Ich habe auch schon ne Lösung gefunden, welche aber Fragen aufwirft welche ich hier gerne gelöst haben möchte.

Also ich habe eine Klasse namens Matrix, welche ich gerne clonen möchte

Um ein geklontes Objekt zu erstellen müssen ja praktisch 2 Sachen durchgeführt werden.

1.) Speicherstelle für das Objekt anlegen ... und
2.) Den angelegten Speicher mit dem Inhalt füllen


Überall im Netz finde ich sowas für das Anlegen des Speichers:

Code:
Matrix<E> myMatrix = (Matrix<E>) super.clone();


Meine Clone-Variable möchte ich natürlich an eine andere Stelle geschrieben haben als mein "Mutter"-Objekt, weil ich einfach 2 verschiedene Objekte haben möchte --> Das ist ja der Sinn des Klonens ..oder?

Wenn cih das obige Beispiel anwende, ist die Variable lediglich eine Referenz auf das Mutterobjekt.

Wenn ich ein tatsächliches geklontes Objekt haben will muss ich es durch folgenden Konstruktoraufruf erstellen:

Code:
Matrix<E> myMatrix = new Matrix<E>(this.sizeX(), this.sizeY());

Das ist ja nicht der Sinn von "super.clone()" oder?

Also nun meine Frage: Was ist der Sinn des folgenden Aufrufs, welchen ich an so vielen Stellen im Netz finde?


Code:
Matrix<E> myMatrix = (Matrix<E>) super.clone();

Danke und Gruss ;-)
 
S

SlaterB

Gast
> Wenn cih das obige Beispiel anwende, ist die Variable lediglich eine Referenz auf das Mutterobjekt.

verstehe ich nicht
Code:
public class Test
{

    public static void main(String[] args)
    {
        Rabbit a = new Rabbit();
        Rabbit b = (Rabbit) a.clone();
        System.out.println(a.hashCode());
        System.out.println(b.hashCode());        
    }
}


class Rabbit
    implements Cloneable
{
    public Object clone()
    {
        try
        {
            return super.clone();
        }
        catch (CloneNotSupportedException e)
        {
            return null;
        }
    }
}
frei nach http://mindprod.com/jgloss/clone.html

Ausgabe:
4565111
20392474

also unterschiedliche Objekte
 

reibi

Top Contributor
Hoi

ich verstehs auch nicht!

Ich hab jetzt mal die Klasse so verändert, dass der Hase einen Namen bekommt.

Code:
public class TestRabbit {
    public static void main(String[] args) {
        Rabbit a = new Rabbit("Bugs Bunny");
        Rabbit b = (Rabbit) a.clone();

        a.changeName("Dexter");
        System.out.println(a.getName());
        System.out.println(b.getName());
    } // end main()
} // end TestRabbit


class Rabbit implements Cloneable {
    private String name;

    public Rabbit(String name) {
        this.name = name;
    } // end Rabbit()

    public void changeName(String name) {
        this.name = name;
    } // end changeName()

    public String getName() {
        return name;
    } // end getName()

    public Object clone() {
        try {
            return super.clone();
        } // end try
        catch (CloneNotSupportedException e) {
            return null;
        } // end catch
    } // end clone()
} // end Rabbit

Ausgabe ist:

Dexter
Bugs Bunny


Das funktioniert gut!


Bei meiner Matrix-Klasse ist warscheinlich ne andere Sache dafür verantwortlich.

Ich recherchier das mal ...

Danke trotzdem ;-)
 

reibi

Top Contributor
So jetzt noch ne Idee ich denke mit einfachen StringMembers gehts und mit Collection gehts nicht, weil die in einer Kopie vielleicht immer noch auf die alten Strings referenzieren.


Starte einfach mal diesen Quelltext und schau.... Das gleiche Problem hab ich ja bei meiner Matrix auch, weils da auch mehrere Collections da sind.


Code:
public class TestRabbit {
    public static void main(String[] args) {
        Rabbit a = new Rabbit("Bugs", "Bunny");
        Rabbit b = (Rabbit) a.clone();

        a.changeFirstName("Dexter");
        System.out.println(a.getFirstName() + " " + a.getLastName());
        System.out.println(b.getFirstName() + " " + b.getLastName());
    } // end main()
} // end TestRabbit


class Rabbit implements Cloneable {
    private List<String> list;

    public Rabbit(String firstname, String lastname) {
    	list = new ArrayList<String>();
        list.add(firstname);
        list.add(lastname);
    } // end Rabbit()

    public void changeFirstName(String firstname) {
        list.set(0, firstname);
    } // end changeFirstName()

    public String getFirstName() {
        return list.get(0);
    } // end getFirstName()

    public String getLastName() {
        return list.get(1);
    } // end getLastName()

    public Object clone() {
        try {
            return super.clone();
        } // end try
        catch (CloneNotSupportedException e) {
            return null;
        } // end catch
    } // end clone()
} // end Rabbit
 
S

SlaterB

Gast
so ist es vorgesehen, stell dir vor ein solches Objekt referenziert die Haupt-Daten-Menge des Programms mit vielen MB an Daten, die will man ja nicht unbedingt kopieren (Stichwort deep copy),
der Standard sieht nur vor, das fraglich Objekt selber zu kopieren und die Exemparvariablen zu übernehmen,

so wie es auch bei new ArrayList(alte Liste), System.arrayCopy(array) oder überall sonst meist der Fall ist


eine einfache Deep-Copy-Implementierung:
http://www.informatik-student.de/2006/12/10/deep-copy-von-java-objekten/
 

reibi

Top Contributor
Geil erklärt! Danke vielmal ;-)

Im Endefekt hätte man das bei jeglichem klonen verwenden können und es in die Hand des Entwicklers legen können ob er es benutzt oder nicht.

Begründung: Wenn ich ein Schaf klone, dann muss es sich ja auch nicht mit dessen "Schwester" ein und die selbe Leber teilen. Alles gibt es zweimal! Ob im Schafstall genügend Platz ist für mehrere Schafe gibt muss der Schäfer entscheiden.


Die Methode "clone()" verwirrt mich als Entwickler nur, geht nicht einher mit dem Objektorientierten Prinzip und man hätte sich das ganze in dieser Art auch sparen können.

Danke nochmal für den guten Hinweis ;-)
 
M

maki

Gast
Die Methode "clone()" verwirrt mich als Entwickler nur, geht nicht einher mit dem Objektorientierten Prinzip und man hätte sich das ganze in dieser Art auch sparen können.
Die Verwirrung liegt an dir ;)

deep copy vs. shallow copy bricht nicht mit dem OO Konzept.

Bei Java Strings zB. macht die shallow copy gar keine Probleme, bei java.util.Date dagegen schon, ersteres ist immutable, letzteres nicht.

Abgesehen davon ist es nicht empfehlenswert clone() zu überschreiben, ist eine missgeburt in Java, lieber einen copy-konstruktor anbieten, besser noch , eine Factory Methode.
 

reibi

Top Contributor
Wie auch immer ...

Ich find SlaterB's Vorschlag mit dem deepCopy nicht schlecht und werde das ab sofort nutzen.

Das "clone()" bzw, dessen Überschreibung ne Missgeburt von Java ist, stimme ich Dir auf jeden Fall zu!
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
H Object cast exception Allgemeine Java-Themen 7
P JDK nicht installiert in Net Object Fusion Allgemeine Java-Themen 7
Erwin82a Object cannot be converted to Custom Class in Lampda Expression Allgemeine Java-Themen 2
Zeppi Cast Object in Generics Allgemeine Java-Themen 4
MoxxiManagarm Mapping into existing object Allgemeine Java-Themen 15
coolian Swing erstellt fillreckt immmer ein neues object Allgemeine Java-Themen 13
N Wo ist Object.class ? Allgemeine Java-Themen 0
R Erste Schritte Object reference funktioniert nicht. Wie mach ichs richtig? Allgemeine Java-Themen 3
RalleYTN Datentypen Herausfinden ob Object ein Array ist ohne den Typen des Arrays zu kennen? Allgemeine Java-Themen 12
N Gibt es etwas allgemeineres as Object? Allgemeine Java-Themen 16
Bananabert Swing jtree : image als user object Allgemeine Java-Themen 2
N ArrayList in eigenem Object nicht richtig serialisierbar Allgemeine Java-Themen 14
B [Android] EditText-Object ist null - Nimmt nicht den Wert des enthaltenen Textfeldes ein Allgemeine Java-Themen 2
Z Vergleich zwischen int und Object Allgemeine Java-Themen 1
D Object nach Vererbung mit Class Object überprüfen Allgemeine Java-Themen 4
T InvalidClassException - Read null attempting to read class descriptor for object Allgemeine Java-Themen 8
J Ist eine Instanz von einem bestimmten Object Typ? Allgemeine Java-Themen 6
L Sortieren von "Map<String, Object>" Allgemeine Java-Themen 2
M Cast double[]-->Object[] oder Vector<double[]> Allgemeine Java-Themen 3
G REST- Object darstellung Allgemeine Java-Themen 6
C Object.equals() liefert falschen Wert? Allgemeine Java-Themen 14
darekkay Generics: Wildcard und Object Allgemeine Java-Themen 5
O Socket Object wird scheinbar falsch empfangen Allgemeine Java-Themen 6
N Klasse/Object Eigenaufruf Allgemeine Java-Themen 5
G JNI Shared Object Allgemeine Java-Themen 10
B Variable class in java.lang.Object Allgemeine Java-Themen 11
S Klassen Zuorgnung Object-char Allgemeine Java-Themen 2
N java.lang.IllegalMonitorStateException: object not locked by thread before notify() Allgemeine Java-Themen 2
S Type mismatch: cannot convert from Object to float Allgemeine Java-Themen 3
A Input/Output Serialisierung und Object.hashCode() Allgemeine Java-Themen 3
M Jaxb und JPA: A cycle is detected in the object graph Allgemeine Java-Themen 5
H double dispatch und equals(Object) Allgemeine Java-Themen 6
J Datentypen Problem mit Date-Object Allgemeine Java-Themen 2
B Variablen Alle RenderingHints.Keys (KEY_*) in Array + alle RenderingHints.Keys (VALUE_*) in Object[] Allgemeine Java-Themen 8
J Verschiedene Klassen als "Object" in ArrayList und dann in for-Schleife erzeugen!? Allgemeine Java-Themen 2
L Object Instanz anhand eines Strings Allgemeine Java-Themen 10
A Datei als Object einlesen und das Object als Singleton instance setzen. Allgemeine Java-Themen 13
DEvent embedded Object Database in Text Format Allgemeine Java-Themen 5
J Casting Problem Object, Double und String Allgemeine Java-Themen 3
M Object-Instanz in Date übersetzen Allgemeine Java-Themen 6
P Tree Object structure Allgemeine Java-Themen 19
G Object mit clone kopieren Allgemeine Java-Themen 21
J merkwürdig: Object Allgemeine Java-Themen 6
woezelmann Object nach Deserialisierung nicht mehr gleich Allgemeine Java-Themen 13
Iron Monkey Object in Datei effizienter lesen / schreiben Allgemeine Java-Themen 13
L Object = null? Allgemeine Java-Themen 16
dayaftereh Serializable und Object In/Out Stream Allgemeine Java-Themen 2
T Object auf Double, Int, String testen Allgemeine Java-Themen 5
N serialize deserialize java object über string Allgemeine Java-Themen 8
N getName() of reflection Object Allgemeine Java-Themen 4
B Probelm mit File Object Allgemeine Java-Themen 6
G NoClassDefFoundError: java/lang/Object Allgemeine Java-Themen 4
S Liste Object Löschen Allgemeine Java-Themen 7
P not enough space for object heap - Trotz mehr RAM? Allgemeine Java-Themen 6
MQue List<String> aus List<Object> generieren Allgemeine Java-Themen 2
M ArrayList<Object[]> und toArray() Allgemeine Java-Themen 5
Daniel_L LinkedList vom Typ Object-Array? Allgemeine Java-Themen 4
B Warum return type Object ? Allgemeine Java-Themen 4
D Generisches Object erstellen Allgemeine Java-Themen 2
M Databinding von Object zu properties-Datei Allgemeine Java-Themen 10
P Wieso HashMap-Zugriff mit Object, statt mit MyObject? Allgemeine Java-Themen 12
A NullPointer bei konvertierung von byteArr --> Object Allgemeine Java-Themen 3
foobar Object to byte[] ohne Serializable Allgemeine Java-Themen 6
C casten vom Typ Object nach Double[][] Allgemeine Java-Themen 2
X cannot convert from Object[] to Integer[] Allgemeine Java-Themen 2
G JSON Object auslesen Allgemeine Java-Themen 1
T cast Object to Double[] Allgemeine Java-Themen 2
G Object. Wrapper Allgemeine Java-Themen 12
V Object durchsuchen Allgemeine Java-Themen 4
U eigene Datenstruktur ArrayList<String> nach Object [][ Allgemeine Java-Themen 2
T "Object o = new Object()" vs. "new Object()&q Allgemeine Java-Themen 8
T Object -> byte[] Allgemeine Java-Themen 5
M Implementation von Zugriffen auf Object[index] in der JVM Allgemeine Java-Themen 9
T Klasse => Primitiv ? Object instanceof Klasse Allgemeine Java-Themen 2
B mit methode ein object zurückgeben. Allgemeine Java-Themen 5
R Object Dynamisch erzeugen (Reflection API) Allgemeine Java-Themen 22
T HashMap (String, Object(String , int)) nach int sortieren Allgemeine Java-Themen 7
P Typ Object in socket umwandeln Allgemeine Java-Themen 4
G Object cast via Reflection Allgemeine Java-Themen 8
Zed JList Object einfügen und Text anzeigen Allgemeine Java-Themen 3
MQue Object in Integer umwandeln Allgemeine Java-Themen 3
G Error: Hashtable Type safety: The method put(Object, Object) Allgemeine Java-Themen 6
T double to object Allgemeine Java-Themen 3
S File Object zu Directory machen ? Allgemeine Java-Themen 9
V Brauche dringend Hilfe. Object-handling Allgemeine Java-Themen 4
N Warning "The Cast from Object to" Allgemeine Java-Themen 9
K Threads und ein übergeordnetes Object Allgemeine Java-Themen 7
F Zugriff mittels getObject() oder this.object ? Allgemeine Java-Themen 8
W Object -> isPrimitiv? Allgemeine Java-Themen 7
D Cast schlägt fehl : Object[] zu Button[] Allgemeine Java-Themen 2
S Object nach Integer umwandeln Allgemeine Java-Themen 13
R object zu array casten. Allgemeine Java-Themen 2
N Map Object Allgemeine Java-Themen 13
G Eine C/C++ Referenz in einem Java Object speichern Allgemeine Java-Themen 5
N Ermitteln welchen Typ ein "Object"-Objekt enthält Allgemeine Java-Themen 11
K Cast ohne neues Object zu erzeugen Allgemeine Java-Themen 12
D Object in int casten Allgemeine Java-Themen 7
N Object-Array mit Comparator absteigend sortieren? Allgemeine Java-Themen 10
D Object to Long casting Allgemeine Java-Themen 9
G Object mit static Feldern speichern Allgemeine Java-Themen 9

Ähnliche Java Themen


Oben