2012-12-02 9 views
7

Um eine Klasse klonbar zu machen, müssen wir in Java die Schnittstelle Cloneable implementieren. Die Implementierung dieser Schnittstelle bedeutet nur, dass diese Klasse das Klonen unterstützt.Warum Klassen in Java nicht standardmäßig geklont werden können

Aber was ist das Motiv von Java-Sprachdesignern, dass sie "standardmäßig nicht zulassen" als Standardfunktionalität jeder Klasse verwenden dürfen?

Wir haben Standard-Implementierung für flache Kopie bereits vorhanden. Warum diese Einschränkung?

Antwort

0

Viele Gründe stehen im Weg, der Hauptgrund ist, dass das Klonen kein Problem für den allgemeinen Fall ist, ähnlich wie bei der Serialisierung.

Die flache Kopie, die Sie standardmäßig erhalten, wird in vielen Fällen die Invarianten des Objekts zerstören, so dass es als allgemeiner Standard-Klonierungsmechanismus außerhalb des Bildes ist.

+0

Frage ist, wenn Sprache Standardmechanismus für seichte Kopie bietet, warum nicht erlauben, es so zu verwenden, wie es ist? Warum ein zusätzlicher Schritt zur Implementierung von Clonable? –

+0

Wie ich bereits sagte, weil dies diese Methode auf den Vertrag jedes einzelnen Java-Objekts zwingen würde, und die standardmäßige flache Kopie ** bricht die Klasseninvarianten ** der meisten Java-Klassen. Dies bedeutet, dass die Klasse gezwungen wäre, gegen ihren Willen zu handeln. Einige Objekte sind nicht einmal theoretisch klonierbar. Denken Sie einen Augenblick an das * Singleton * -Muster. –

3

Es ist eine Marker-Schnittstelle, um Java wissen zu lassen, dass die implementierende Klasse absichtlich für das Klonen von entworfen wurde (ähnliche Verwendung wie für andere Marker-Schnittstellen). Wenn Sie weiter lesen, dann finden Sie unter:

Vereinbarungs Klassen, die diese Schnittstelle implementieren außer Kraft setzen sollte Object.clone (die geschützt ist) mit einem öffentlichen Verfahren. Details zum Überschreiben dieser Methode finden Sie unter Object.clone().

Sie müssen benutzerdefinierte Methode für das Klonen bereitstellen. Durch die Schnittstelle Cloneable weiß Java, dass Sie absichtlich das Klonen Ihres Objekts unterstützen. Wenn Sie Ihre benutzerdefinierte Methode clone bereitstellen, werden die Standardmethode clone des Objekts überschrieben.

Auf diese Weise, erhalten Sie die Flexibilität zu entscheiden (Mark), welche Objekte geklont werden können und welche nicht. Wenn Clone-fähig ist bis zu welcher Ebene (sehr nützlich in Objekt-Graph-Fällen).

+0

Die Frage ist, ob die Sprache einen Standardmechanismus für die seichte Kopie bietet, warum dann nicht erlauben, sie so zu benutzen, wie sie ist? Warum ein zusätzlicher Schritt zur Implementierung von Clonable? –

+0

@KaushikLele Das habe ich versucht zu erklären.Shallow Copy ist ein leichter Prozess, bei dem Sie nicht alle neuen Objekte im Speicher erstellen (Sie verwenden die Speicherreferenzen). Hier erstellen Sie neue Objekte. In diesem Fall bietet diese Schnittstelle einen Mechanismus, über den Sie entscheiden können, was Sie kopieren möchten und was nicht. Dies wird sehr nützlich, wenn Sie mit langen Objektdiagrammen (verschachtelten Objekten) arbeiten. –

5

Denken Sie über das Klonen eines Objekts mit verschachtelten Eigenschaften nach. Wie tief rekursiv willst du gehen? Dies könnte für das Gedächtnis schwierig sein, so dass die Entwickler es uns überlassen haben, zu entscheiden.

+1

Standard-Implementierung erstellt flache Kopie, so dass es keine Frage von "wie tief", Entwickler wollen gehen. Die Frage ist, ob die Sprache einen Standardmechanismus für die seichte Kopie zur Verfügung stellt, warum dann nicht erlauben, sie so zu benutzen, wie sie ist? Warum ein zusätzlicher Schritt von Clonable –

+0

Denken Sie an clone() auf ein Objekt mit Bezug auf object2. Jetzt rufen Sie copy.getObject2() auf. SetX (x). Sie haben object2 für beide geändert (weil es immer noch eine Referenz in der standardmäßigen flachen Kopie ist. Das bedeutet, dass clone() eine gefährliche Methode ist, daher ist es besser, sie als eine weitere Zeile der Fehlerverteidigung zu markieren. –

0

Die "Cloneable" -Schnittstelle ist Teil eines Entwurfsmusters, das "Marker Class" genannt wird. Grundsätzlich wird innerhalb der Clone-Methode ein Verweis auf einen Typ "Cloneable" verwendet. Wenn Sie die klonbare Schnittstelle implementieren, bedeutet dies, dass auf Ihre Klasse als Typ "Cloneable" verwiesen werden kann.

Der andere Grund, in der Praxis, ist, dass Sie die "clone()" -Methode überschreiben und auf Ihre eigene Weise klonen. Das bedeutet, dass die Daten, die Sie für wichtig halten, in der neuen Klasse vorhanden sind.