Warum ist die clone () - Methode protected in java.lang.Objekt?
Was ist der spezifische Grund dafür, dass clone()
ist als protected definiert in java.lang.Object
?
InformationsquelleAutor Alex N. | 2009-07-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Tatsache, dass der Klon geschützt ist, ist äußerst zweifelhaft - ebenso wie die Tatsache, dass die
clone
Methode nicht deklariert ist, in derCloneable
- Schnittstelle.Macht es die Methode ziemlich nutzlos für die Aufnahme von Daten-Kopien, weil kann man nicht sagen,:
Ich denke, dass das design
Cloneable
ist jetzt weitgehend als Fehlentscheidung (Zitat unten). Ich würde normalerweise in der Lage sein wollen, um Implementierungen einer SchnittstelleCloneable
aber nicht unbedingt die SchnittstelleCloneable
(ähnlich wie die Verwendung vonSerializable
). Dies kann nicht getan werden ohne Reflexion:"Ich denke, dass das design von Cloneable ist nun weitgehend als ein Fehler." [citation needed]
Sorry - ich war nicht impliziert, dass. Ich habe lediglich impliziert, dass "gutes" design ist nicht ein interface erweitern
Serializable
- es ist bis zu Implementierungen, um zu entscheiden, ob zu implementierenSerializable
. Ich war die Ausweitung aufCloneable
- es ist nicht etwas, das eine Schnittstelle erweitert werden soll - aber eine Implementierung einer Schnittstelle ist frei, umCloneable
. Das Problem ist, wenn Sie einen parameter des interface-Typs, Fragen Sie, Fragen Sie es, ob es cloneable; aber dann kann man eigentlich nicht Klonen!Blochs effektive Java-pp45. "Die Cloneable-Schnittstelle gedacht war, als mixin-interface für Objekte, die damit werben, dass Sie erlauben das Klonen. Leider haben Sie es versäumt, die diesem Zweck dienen"
Zitat Hinzugefügt, um Haupt-Eintrag
InformationsquelleAutor oxbow_lakes
Den Clonable-interface ist nur eine Markierung zu sagen, die Klasse unterstützen können-Klon. Die Methode ist geschützt, da sollten Sie nicht rufen Sie es auf das Objekt, man kann (und sollte) man überschreiben als "öffentlich".
Aus Der Sonne:
In der Klasse Objekt, die clone () - Methode ist als geschützt. Wenn alles, was Sie tun, zu implementieren, Cloneable, nur Unterklassen und Mitglieder der gleichen Paket können invoke clone() auf dem Objekt. Zu ermöglichen, jede Klasse, jedes Paket, um den Zugriff auf die clone () - Methode, die Sie haben, um es zu überschreiben, und erklären Sie der öffentlichkeit, wie dies weiter unten. (Wenn Sie eine Methode überschreiben, können Sie machen es weniger privat, aber nicht mehr privat. Hier der protected clone () - Methode in Object wird überschrieben, da Sie eine öffentliche Methode.)
Set
aber vielleicht einige Implementierungen von Set sind nicht klonbar
Sie können sich nicht Klonen alles, was nicht implementieren die Clonable-interface-es ist eine Markierung, die sagt "Diese Klasse ist richtig clonable" - sehr ähnlich dem Serializable-interface. Übrigens, es gibt einen Weg, um Klon-Klassen über die Serialisierung, die gut funktioniert--google so etwas wie "java-Serialisierung-Klon", und Sie werden wahrscheinlich feststellen, eine Handvoll von Möglichkeiten, um eine Tiefe Kopie des Objekts.
Sie können sich nicht Klonen alles, was nicht implementieren des Cloneable-interface, aber nur weil etwas implementiert das Cloneable-interface bedeutet nicht, Sie zu Klonen.
toString ist eine default-Implementierung, wenn Sie nennen es etwas gutes wird passieren und du bekommst einen string zurück. gleich hat eine default-Implementierung (wie ==). Klon kann nicht über eine Standard-Implementierung. Wenn Sie einen call-Klon auf ein Objekt, das noch nicht umgesetzt, Sie werden sich nicht angemessen Verhalten. Klonen ist kompliziert und kann nicht wirklich automatisch gemacht werden (einige Objekte ohne Standard-Konstruktoren kann unmöglich zu generisch-Klon), so dass Sie standardmäßig so machen es ein wenig sicherer zu machen. Ich denke, dass man es auf Object überhaupt, aber vielleicht gar nicht nötig gewesen.
InformationsquelleAutor Bill K
clone
geschützt ist, weil es etwas ist, sollten außer Kraft gesetzt werden, so dass Sie spezifisch auf die aktuelle Klasse. Zwar wäre es möglich, erstellen Sie eine öffentlicheclone
- Methode, würde der Klon ein beliebiges Objekt überhaupt, das wäre nicht so gut, wie eine Methode geschrieben, die speziell für die Klasse, die es braucht.Es ist geschützt, so dass Sie nicht verwenden die man im Objekt (es wird nur eine Ausnahme werfen, sowieso). Sie wollen, dass Sie, um es zu überschreiben in einer Klasse, dann machen Sie es öffentlich. (mit der Antwort ein paar mal auch unten)
Und nutzlos, wenn man Schnittstellen wie pro mein Punkt unten
sollten außer Kraft gesetzt werden, ist nicht ganz klar, dann sollte es schon Abstrakt und muss dann nicht in der Object-Klasse, ich bin stark versucht, zu verstehen, warum es so ist.
InformationsquelleAutor Andrew Hare
Die Clone-Methode kann nicht direkt verwendet werden, auf ein Objekt, das ist, warum es soll überschrieben werden, die von der Unterklasse.
Natürlich könnte es sein, öffentliche und werfen eine entsprechende Ausnahme beim Klonen ist nicht möglich, aber ich denke, das wäre irreführend.
Den Weg Klon implementiert ist, jetzt macht Sie denken, warum Sie verwenden möchten, Klon, und wie Sie wollen Ihr Objekt geklont werden.
InformationsquelleAutor Silfverstrom
Ist es geschützt, da die Standard-Implementierung stellt eine flache memberwise kopieren aller Felder (einschließlich private) umgehen Konstruktor. Dies ist nicht etwas, was ein Objekt sein könnte, entworfen, um in den ersten Platz (es könnte z.B. auf Spur zu halten erstellte Objekt-Instanzen in einer gemeinsamen Liste, oder ähnliches).
Aus dem gleichen Grund, den default-Implementierung von
clone()
werfen wird, wenn das Objekt es heißt nicht implementierenCloneable
. Es ist ein potenziell unsicheren Vorgang mit weitreichenden Konsequenzen, und deshalb wird sich der Verfasser von der Klasse müssen explizit opt-in.Nein, es muss nicht nur werfen. Aus seiner JavaDoc: "Die Methode clone der Klasse Object führt eine spezielle cloning-Vorgang. Erstens, wenn die Klasse des Objekts implementiert nicht das interface Cloneable ist, dann wird eine CloneNotSupportedException geworfen wird. Beachten Sie, dass alle arrays sind betrachtet zu implementieren das interface Cloneable. Sonst, diese Methode erstellt eine neue Instanz der Klasse dieses Objekts und initialisiert alle seine Felder mit genau dem Inhalt der entsprechenden Felder dieses Objekts, als wenn durch die Abtretung anzuzeigen; der Inhalt der Felder nicht selbst geklont."
InformationsquelleAutor Pavel Minaev
Aus der javadoc von cloneable.
So könnte man call-Klon auf jedes Objekt, aber das würde Sie die meiste Zeit nicht die Ergebnisse, die Sie wollen, oder eine Ausnahme. Aber nur gefördert, wenn Sie cloneable implementieren.
Sorry für meine etwas unklar letzten zwei Sätze...
InformationsquelleAutor Janusz
IMHO ist es so einfach:
#clone
muss nicht aufgerufen werden, die auf non-cloneable Objekte, daher ist es nicht öffentlich gemacht#clone
aufgerufen werden, die von Unterklassen obObject
, die Cloneable implementieren, um die flache Kopie von der richtigen KlasseWas ist der richtige Rahmen für Methoden, sind aufrufbar sein, die von Unterklassen, aber nicht durch andere Klassen?
Es ist
protected
.Klassen implementieren
Cloneable
natürlich wird diese Methode öffentlich, damit es aufgerufen werden kann von anderen Klassen.InformationsquelleAutor Michaela Elschner
Clone () - Methode einen check intern '- Instanz klonbar oder nicht".Dies ist, wie die Java-team vielleicht dachte beschränken die unsachgemäße Verwendung von clone () - Methode.clone () - Methode ist geschützt, d.h. Zugriff von Unterklassen nur. Da Objekt ist die übergeordnete Klasse aller sub-Klassen, also Clone () - Methode kann verwendet werden, durch alle Klassen, selbst wenn wir nicht über check 'Instanz von Cloneable'. Dies ist der Grund, Java-team gedacht haben mögen, Schränken Sie die unsachgemäße Verwendung von clone() durch die Prüfung in der clone () - Methode 'ist es eine Instanz von Cloneable'.
Daher was auch immer Klassen, die cloneable implementieren können clone () - Methode der Object-Klasse.
Auch gemacht, da es geschützt, es ist nur für diesen sub-Klassen, die cloneable implementiert-interface. Wenn wir wollen, machen es der öffentlichkeit, diese Methode muss überschrieben werden, indem die sub-Klasse mit Ihren eigenen Durchführung.
InformationsquelleAutor SARIKA
Ja, dasselbe problem, das ich traf.
Aber ich löse es durch die Umsetzung dieses code
Nur als das vor, das jemand sagte.
InformationsquelleAutor
Gut, auch die sun-Entwickler sind auch nur Menschen, und Sie tatsächlich machen große Fehler zur Implementierung der clone-Methode als protected, die gleichen Fehler wie Sie implementiert eine nicht-funktionierende clone-Methode in der ArrayList! Also, im Allgemeinen, gibt es ein viel tieferes Missverständnis, auch erfahrene Java-Programmierer über die clone-Methode.
Allerdings habe ich vor kurzem fand eine schnelle und einfache Lösung zum kopieren jedes Objekt mit allen seinen Inhalten, egal wie es aufgebaut ist und was es enthält, siehe meine Antwort hier: Fehler in der Objekt -.clone () -
InformationsquelleAutor mark
Wieder, Java JDK Rahmen zeigt brillante denken:
Cloneable-Schnittstelle nicht enthalten, eine "öffentliche T clone();" Methode, denn Sie wirkt mehr wie ein Attribut (zB. Serializable), die es einer Instanz, die es geklont zu sein.
Es ist nichts falsch mit diesem design, weil:
Objekt.clone() wird nicht tun, was Sie wollen mit Ihre benutzerdefinierte Klasse.
Wenn du Myclass implements Cloneable => Sie überschreibt clone() mit
"public MyClass" clone()"
Wenn Sie MyInterface extends Cloneable und einige MyClasses Implementierung von MyInterface:
definieren Sie einfach "public MyInterface clone();" in das interface und jede Methode, die mit MyInterface Objekte werden in der Lage sein zu Klonen, unabhängig von Ihrem MyClass-Klasse.
InformationsquelleAutor Victor