2012-12-02 14 views
7

In Java, per rendere una classe clonabile, è necessario implementare l'interfaccia Cloneable. Implementare questa interfaccia, è solo per dire che questa classe supporta la clonazione.Perché le classi in Java non sono clonabili per impostazione predefinita

Ma quale è il motivo dei progettisti di linguaggio Java per non aver fatto "permesso di clonare" come funzionalità predefinita di ogni classe?

L'implementazione predefinita per copia superficiale è già presente. Allora perché questa restrizione?

risposta

0

Molte ragioni si frappongono, il principale è che la clonazione non è un problema risolvibile per il caso generale, proprio come la serializzazione.

La copia superficiale che ottieni per impostazione predefinita in molti casi distrugge gli invarianti dell'oggetto in modo che sia fuori dall'immagine come meccanismo di clonazione generale predefinito.

+0

La domanda è se il linguaggio fornisce un meccanismo predefinito per la copia superficiale, quindi perché non consentire l'utilizzo così com'è? Perché un ulteriore passaggio per implementare Clonable? –

+0

Come ho detto, perché questo imporrà questo metodo sul contratto di ogni singolo oggetto Java, e la copia superficiale predefinita ** interromperà gli invarianti di classe ** della maggior parte delle classi Java. Ciò significa che la classe sarebbe costretta a implementare contro la sua volontà. Alcuni oggetti non sono neppure teoricamente clonealbili. Pensa al pattern * Singleton * per un momento. –

3

È un'interfaccia marker per far sapere a Java che la classe di implementazione è intenzionalmente progettata per la clonazione di (uso simile a quello di altre interfacce di marcatori). Se leggete oltre, allora che trovate qui sotto:

Per convenzione, le classi che implementano questa interfaccia dovrebbe ignorare Object.clone (che è protetta) con un metodo pubblico. Vedi Object.clone() per dettagli su come sovrascrivere questo metodo.

È necessario fornire un metodo personalizzato per la clonazione. Avendo l'interfaccia Cloneable, Java è consapevole del fatto che stai intenzionalmente supportando la clonazione dell'oggetto. Fornendo il tuo metodo personalizzato clone, stai eliminando il metodo predefinito clone dell'oggetto.

In questo modo, si ottiene la flessibilità di decidere (Mark), quali oggetti possono essere clonati e quali no. Se è possibile clonare fino a quale livello (molto utile nei casi di oggetti grafici).

+0

La domanda è se la lingua fornisce un meccanismo predefinito per la copia superficiale, quindi perché non consentire l'utilizzo così com'è? Perché un ulteriore passaggio per implementare Clonable? –

+0

@KaushikLele Questo è quello che ho cercato di spiegare.La copia superficiale è un processo leggero in cui non si stanno creando tutti i nuovi oggetti in memoria (si stanno riutilizzando i riferimenti di memoria). Qui stai creando nuovi oggetti. In tal caso, tale interfaccia fornisce un meccanismo in cui è possibile decidere cosa copiare e cosa no. Questo diventa molto utile quando si affrontano grafici a oggetti lunghi (oggetti nidificati). –

5

Pensa alla clonazione di un oggetto con proprietà nidificate. Quanto in profondità vuoi recursivamente? Questo potrebbe essere difficile per la memoria, quindi gli sviluppatori lo hanno lasciato a noi decidere.

+1

L'implementazione predefinita ha creato una copia superficiale, quindi non c'è alcun problema di "quanto profondo", gli sviluppatori vogliono andare. La domanda è se la lingua fornisce un meccanismo predefinito per la copia superficiale, quindi perché non consentire l'utilizzo così com'è? Perché un ulteriore passaggio di Clonable –

+0

Pensa a clone() su un oggetto con riferimento a oggetto2. Ora chiami copy.getObject2(). SetX (x). Hai cambiato l'oggetto 2 per entrambi (perché è ancora un riferimento nella copia superficiale predefinita. Ciò significa che clone() è un metodo pericoloso, quindi è meglio contrassegnarlo come un'altra difesa degli errori di riga. –

0

L'interfaccia "Cloneable" fa parte di un modello di progettazione denominato "Marker Class". Fondamentalmente, all'interno del metodo clone ci sarà qualche riferimento a un tipo "Cloneable". Quando si implementa l'interfaccia clonabile, significa che la classe può essere referenziata come tipo "Clonabile".

L'altro motivo, in pratica, è che si esegue l'override del metodo "clone()" e si clona nel proprio modo specifico. Ciò significa che i dati che ritieni importanti sono presenti nella nuova classe.

Problemi correlati