2013-05-12 13 views
16

mi sono imbattuto in un certo codice classe che implementa Clonable, la documentazione afferma:qual è il punto nel permettere alla mia classe di implementare Cloneable?

Una classe implementa l'interfaccia Cloneable per indicare al Object.clone() che è legale per quel metodo per fare un campo- copia per campo di istanze di quella classe. Richiamando il metodo clone di Object su un'istanza che non implementa l'interfaccia Cloneable, viene generata l'eccezione CloneNotSupportedException generata. Per convenzione, le classi che implementano questa interfaccia devono eseguire l'override di Object.clone (che è protetto) con un metodo pubblico. Vedi Object.clone() per dettagli su come sovrascrivere questo metodo. Si noti che questa interfaccia non contiene il metodo clone. Pertanto, non è possibile clonare un oggetto semplicemente in virtù del fatto che implementa questa interfaccia. Anche se il metodo clone è invocato in modo riflessivo, non vi è alcuna garanzia che abbia successo.

non riesco a capire il punto nell'attuazione questa classe, come detto nella documentazione metodo .clone non è implementato nell'interfaccia, e devo attuazione. Allora perché usare questa lezione? Perché non scriverò semplicemente un metodo copyClass nella mia classe per eseguire la copia dell'oggetto senza l'implementazione di questa classe?

Grazie in anticipo.

+1

La tua classe implementa Cloneable in modo da poter utilizzare i meccanismi di clonazione incorporati, in modo che altre classi possano clonare la tua senza dover conoscere i suoi metodi di clonazione univoci. Sì, è un modo un po 'strano per gestirlo, ma in parte ha a che fare con la retrocompatibilità. –

risposta

22

Per l'attuazione del metodo clone, è sufficiente fare:

public Object clone() throws CloneNotSupportedException { 
    return super.clone(); 
} 

Ovviamente si può personalizzare il metodo di fare una copia più profonda, se necessario.

Chiamare super.clone() è quasi obbligatorio perché, a meno che la classe non sia definitiva e quindi non possa essere ignorata, il metodo clone() deve restituire un'istanza della stessa classe dell'oggetto su cui è stata chiamata. Quindi, semplicemente creando una nuova istanza e copia lo stato funzionerà per questa classe, ma non per tutte le sottoclassi. Inoltre, non hai sempre accesso a tutto lo stato contenuto nelle superclassi.

In breve, si rende pubblico il metodo clone protetto dell'oggetto. E la prima cosa che il metodo Object.clone() fa è (questo non è il codice vero e proprio, ma questo è ciò che il metodo fa):

if (!(this instanceof Cloneable)) { 
    throw new CloneNotSupportedException(); 
} 

Quindi, Cloneable è solo un'interfaccia marcatore per lasciare che il metodo di Object.clone() sapere che non deve generare un'eccezione quando viene chiamato.

Questa è una delle parti di Java più mal progettate. Di solito, dovresti preferire l'uso di un contructor di copia invece di usare clone().

+0

Come posso capire dalla tua risposta, oggi non è consigliabile utilizzare questa interfaccia, ed è solo uso: se voglio usare il metodo clone della classe Object, dovrei implementarlo. Nel mio caso (la classe in cui ho visto questa implementazione) è stata implementata una copia più approfondita della classe, quindi in questo caso è la ragione per implementare questa interfaccia? –

+0

Se si desidera eseguire l'override e utilizzare il metodo 'Object.clone()', è necessario implementare questa interfaccia. Se vuoi eseguire una copia in un altro modo, fai semplicemente ciò che vuoi. –

+0

Hai capito, quindi l'override dell'oggetto Object.clone() mi obbliga a usare questa interfaccia. Grazie per la tua risposta informativa. –

1

Consente di scrivere codice più generico. Se hai più classi che implementano l'interfaccia Cloneable e vuoi passare le loro istanze come argomento al metodo, non devi creare più metodi che differiscono da un tipo di variabile, puoi semplicemente usare Cloneable t. È lo stesso con altre interfacce. E, lo stesso vale per ogni altra interfaccia, è un tipo di eredità multipla. L'implementazione di tali interfacce rende il codice più leggibile.