2013-07-31 14 views
7

Ho sempre pensato che clone() crea un oggetto senza chiamare un costruttore.È possibile clonare metodo creare oggetto utilizzando il costruttore

Ma, durante la lettura Effective Java Articolo 11: Override clone giudiziosamente, ho trovato una dichiarazione che dice che

La disposizione che “non costruttori sono chiamati” è troppo forte. Un metodo clone ben educato può chiamare i costruttori per creare oggetti interni al clone in costruzione. . Se la classe è definitiva, il clone può anche restituire un oggetto creato da un costruttore.

Qualcuno può spiegarmi questo per favore?

+1

Il metodo 'clone()' non chiama il costruttore, il suo comportamento predefinito è che eseguirà una copia superficiale. ma se vogliamo eseguire una copia profonda abbiamo bisogno di sovrascrivere il metodo 'clone()', dal quale possiamo restituire un nuovo oggetto. – swapy

risposta

12

Ho sempre pensato che clone() crea un oggetto senza chiamare un costruttore.

L'implementazione in Object.clone() non chiama un costruttore.

Non c'è niente che ti impedisca di implementarlo tu stesso in un modo che lo fa. Ad esempio, questo è perfettamente valida clone() implementazione:

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); 
    } 
} 

Si può solo fare questo (incondizionatamente) se la classe è final, perché allora si può garantire di tornare un oggetto dello stesso tipo di quello originale.

Se la classe non è definitiva, penso che si potrebbe verifica se l'istanza è stata "solo" un esempio del tipo di override clone() e gestirlo in modo diverso nei diversi casi ... sarebbe strano farlo anche se.

+0

Perché posso farlo solo se la lezione è definitiva? Se lo faccio in una classe non finale, ci sarà qualche tipo di impatto? – Anand

+2

@Anand: 'clone()' deve restituire un'istanza dello stesso tipo dell'originale. Se la classe non è definitiva, devi considerare la possibilità che "this" faccia riferimento a un'istanza di una sottoclasse. –

Problemi correlati