2013-07-31 10 views
7

Ich dachte immer, dass clone() erstellt ein Objekt ohne einen Konstruktor aufrufen.Kann Klon Methode erstellen Objekt mit Konstruktor

Aber beim Lesen Effective Java Punkt 11: Überschreiben von Klon umsichtig, fand ich eine Erklärung, die besagt, dass

Die Bestimmung, dass zu stark „kein Bauer genannt wird“ ist. Eine wohlverstandene Clone-Methode kann Konstruktoren aufrufen, um Objekte intern für den im Aufbau befindlichen Klon zu erstellen. Wenn die Klasse final ist, kann der Klon sogar ein Objekt zurückgeben, das von einem Konstruktor erstellt wurde.

Kann mir bitte jemand das erklären?

+1

'clone()' Methode ruft Konstruktor nicht auf, sein Standardverhalten ist, dass es eine flache Kopie ausführt. aber wenn wir eine tiefe Kopie durchführen wollen, müssen wir die 'clone()' Methode überschreiben, von der wir ein neues Objekt zurückgeben können. – swapy

Antwort

12

Ich dachte immer, dass clone() ein Objekt erstellt, ohne einen Konstruktor aufzurufen.

Die Implementierung in Object.clone() ruft keinen Konstruktor auf.

Es gibt nichts, was Sie daran hindern könnte, es selbst so zu implementieren, dass es funktioniert. Zum Beispiel ist dies eine absolut gültige clone() Umsetzung:

public final class Foo implements Cloneable { 
    private final int bar; 

    public Foo(int bar) { 
     this.bar = bar; 
    } 

    @Override 
    public Object clone() { 
     return new Foo(bar); 
    } 
} 

Sie können dies nur tun (bedingungslos), wenn die Klasse final ist, denn dann können Sie garantieren, ein Objekt des gleichen Typs wie das Original zurückkehren.

Wenn die Klasse nicht endgültig ist, ich denke, man könnte prüfen, ob die Instanz „nur“ eine Instanz des Typs war clone() zwingende und behandelt es anders in verschiedenen Fällen ... es wäre seltsam, dies zu tun obwohl.

+0

Warum kann ich das nur tun, wenn die Klasse endgültig ist? Wenn ich das in der nicht-finalen Klasse mache, wird es irgendwelche Auswirkungen geben? – Anand

+2

@Anand: 'clone()' muss eine Instanz des gleichen Typs wie das Original zurückgeben. Wenn die Klasse nicht final ist, müssen Sie die Möglichkeit in Betracht ziehen, dass 'this 'sich auf eine Instanz einer Unterklasse bezieht. –