clone() wegen leerem Cloneable quasi nutzlos?

xehpuk

Top Contributor
Moin, Leute!

Kann es sein, dass dem Java-Team ein großer Fehler beim Implementieren des Klonmechanismus unterlaufen ist? Dass clone() in Object steht und Cloneable einfach nur leer ist, wirkt nicht nur auf den ersten Blick ziemlich dämlich, sondern auch noch auf den zweiten Blick.

Gibt es dafür eine logische Erklärung? Bei meiner bisherigen Recherche habe ich nur gelesen, dass da durch Zeitknappheit einfach nur ein Fehler gemacht wurde.

Nun ist es ja unter anderem so, dass man z. B. bei heterogenen Collections, die nur Cloneables beinhalten, Reflection benutzen muss, um überhaupt clone() auf die einzelnen Elemente aufrufen zu können.

Wenn es für diese Designentscheidung keine Erklärung gibt, gibt es dann wenigstens Aussicht auf eine Änderung in späteren JDKs?
 
M

maki

Gast
Joshua Bloch hat in seinem Buch "Effective Java" mal darauf hingewiesen das clone() in Java an sich eine Missgeburt ist und man es meiden sollte falls möglich, details weiss ich keine mehr dazu, da ich es nicht benutze.

So grundlegende Änderungen würde nicht nicht erwarten, speziell wenn es bedeuten würde dass alter Code sich anders verhält.
 

slawaweis

Bekanntes Mitglied
Kann es sein, dass dem Java-Team ein großer Fehler beim Implementieren des Klonmechanismus unterlaufen ist? Dass clone() in Object steht und Cloneable einfach nur leer ist, wirkt nicht nur auf den ersten Blick ziemlich dämlich, sondern auch noch auf den zweiten Blick.

Gibt es dafür eine logische Erklärung? Bei meiner bisherigen Recherche habe ich nur gelesen, dass da durch Zeitknappheit einfach nur ein Fehler gemacht wurde.
die ursprüngliche Idee (für Kaffeemaschinen und Toaster) war mit Cloneable ein Objekt zu markieren, damit die JVM weis, dass davon eine 1:1 binäre Kopie gemacht werden darf. Object.clone() müsste nur dann überschrieben werden, wenn man das Klonen/Kopieren zusätzlich kontrollieren wollte. Nur ist Klonen bei Objektnetzen alles andere als trivial, so dass dieser Ansatz den Anforderungen nicht genügte.

Wenn es für diese Designentscheidung keine Erklärung gibt, gibt es dann wenigstens Aussicht auf eine Änderung in späteren JDKs?
eher nicht. Diese Sache ist, wie das stop() in Thread, kaum pauschal zu definieren. Verschiedene Ansätze brauchen verschiedene Lösungen. Ich bevorzuge z.B. CloneFactories, wo das Klonen/Kopieren von einer externen Logik übernommen wird.

Slawa
 

Empire Phoenix

Top Contributor
Bei primitiven Objecten ist clone() durchaus nützlich -> alles was keine Referenzen enthält kann man so schnell und effizient clonen. Allerdings ist es eindeutig ein DesignFehler das clone() in object drinnen ist. Da man es überschreiben kann kann man es aber zumindest an eigene Bedürfnisse problemlos anpassen.

Ich bevorzuge btw clone() selber zu implementieren für alle Objecte bei denen ich diese funktionalität brauche.
 

homer65

Top Contributor
Es gab da mal hier im Forum einen Beitrag zum Thema. Stichwort war glaube ich "Deep Copy" oder so ähnlich.
Jedenfalls wurde ein Object in ein ByteArray zwischenkopiert und dann von da aus in ein anderes weiterkopiert.
War eine verhältnissmäßig einfache Art und Weise eine Kopie von einem Objekt zu bekommen.
Edit:
Habs gefunden:
http://www.java-forum.org/java-basics-anfaenger-themen/30995-deep-copy-objekten.html
 
Zuletzt bearbeitet:
M

maki

Gast
@homer65

Clonen per Serialisierung ist nicht die schnellste Art, aber u.U. die einfachste, wenn man wirklich clone() nutzen will.
 

Wildcard

Top Contributor
Besser ist oft ein Copy Konstruktor, oder ein externer Mechanismus. Ein Beispiel dafür sind von EMF erzeugte Klassen die dank der erweiterten EMF Reflection einheitlich geklont werden können.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Methoden clone(), arraycopy(): ein- und zweidimensionale Arrays Allgemeine Java-Themen 8
A deepcopy mit clone() Allgemeine Java-Themen 2
R Gleiche Objektreferenz trotz clone()? Allgemeine Java-Themen 12
P Unterschiedliche Clone- Methoden Allgemeine Java-Themen 5
H Frage zu clone() Allgemeine Java-Themen 5
M Überschreiben der clone()-Methode Allgemeine Java-Themen 10
G Object mit clone kopieren Allgemeine Java-Themen 21
R Eigenes Objekt - clone() Allgemeine Java-Themen 2
V clone() ? Allgemeine Java-Themen 4
T abstract + clone() = BUMM! Allgemeine Java-Themen 3
J immutable HashMaps und clone() Allgemeine Java-Themen 3
M Gibt es eigentlich einen Standalone-Java-ICQ-clone Allgemeine Java-Themen 19
M clone-methode nicht verfügbar Allgemeine Java-Themen 10
0 Keine clone-Methode für BigDecimal und BigInteger? Allgemeine Java-Themen 3
M Problem mit Generics und clone() Allgemeine Java-Themen 2
K The method clone() from the type Object is not visible. Allgemeine Java-Themen 9
O Java-Applikation tut in Netbeans, als JAR nicht, wegen Pfadangaben einer benötigten Datei Allgemeine Java-Themen 8
L Übergabe an eine eher einfache Java- Applikation wegen Kündigung Allgemeine Java-Themen 1
H Frage wegen Heap-Speicher Allgemeine Java-Themen 2
I EDT scheint zu blocken wegen Dateioperation in anderem Thread Allgemeine Java-Themen 9
B jar File macht probleme wegen einer Methode! Allgemeine Java-Themen 5
F Frage wegen Tasks Allgemeine Java-Themen 2
L Programm läßt sich wegen Java unter Linux nicht starten Allgemeine Java-Themen 4
C Flimmern wegen eines Thread verhindern Allgemeine Java-Themen 8
D jdk fehlermeldung probleme wegen der partition? Allgemeine Java-Themen 10
S Alternative zu Robot (wegen Umlauten) Allgemeine Java-Themen 13
P java high cpu load wegen endlosschleife Allgemeine Java-Themen 6
S SWING UND AWT!Problem wegen Canvas! Allgemeine Java-Themen 29
M Performanceproblem wegen ständiger Skriptausführung Allgemeine Java-Themen 3
C frage wegen arrays Allgemeine Java-Themen 8
C frage wegen jar Allgemeine Java-Themen 9
C Schleife mit leerem Anweisungsblock wird trotz erfüllter Bedingung nicht verlassen Allgemeine Java-Themen 9
B Exception bei leerem JTable verhindern Allgemeine Java-Themen 10
K Kein schließendes Tag bei leerem Element mit JDOM Allgemeine Java-Themen 8

Ähnliche Java Themen

Neue Themen


Oben