Interfacce marker e copie profonde - 1

"Ciao, Amico!"

"Ciao Bilaabo!"

"Oggi vi parlerò delle interfacce dei marcatori ."

"Le interfacce marker sono interfacce senza metodi. Quando una classe implementa un'interfaccia di questo tipo, diciamo che ne è contrassegnata."

"Esempi di queste interfacce includono: Cloneable, Serializable, Remote ."

"L' interfaccia Serializable viene utilizzata per contrassegnare le classi che supportano la serializzazione, indicando che le istanze di queste classi possono essere serializzate e deserializzate automaticamente."

"L' interfaccia remota viene utilizzata per identificare oggetti che supportano l'esecuzione remota, ovvero metodi che possono essere richiamati da un'altra macchina virtuale Java e/o da un computer diverso."

"L' interfaccia Cloneable viene utilizzata per contrassegnare le classi che supportano la clonazione."

"Oh, riguardo alla clonazione o alla copia."

"Esistono due tipi di copia: superficiale e profonda."

" La copia superficiale sta creando una copia di un oggetto, senza creare duplicati di nessuno degli oggetti a cui fa riferimento."

" La copia profonda implica la duplicazione di un oggetto, inclusi gli oggetti a cui fa riferimento e gli oggetti a cui fanno riferimento quegli oggetti, ecc."

"Esiste un ottimo modo per creare in modo affidabile un clone profondo."

"Questo metodo funziona anche se gli sviluppatori hanno dimenticato di contrassegnare una classe come Cloneable. "L'unico requisito è che gli oggetti devono essere serializzabili."

"Ecco come lo fai:"

1) Creare un buffer (array di byte) in memoria.

2) Serializzare l'oggetto ei suboggetti nel buffer.

3) Deserializzare la gerarchia degli oggetti salvata nel buffer.

Codice
BigObject objectOriginal = new BigObject();

ByteArrayOutputStream writeBuffer = new ByteArrayOutputStream();
ObjectOutputStream outputStream = new ObjectOutputStream(writeBuffer);
outputStream.writeObject(objectOriginal);
outputStream.close();

byte[] buffer = writeBuffer.toByteArray();
ByteArrayInputStream readBuffer = new ByteArrayInputStream(buffer);
ObjectInputStream inputStream = new ObjectInputStream(readBuffer);
BigObject objectCopy = (BigObject)inputStream.readObject();

"Nella prima riga, creiamo objectOriginal , che cloneremo. L'oggetto e tutti i suoi sottooggetti devono supportare la serializzazione."

"Nella terza riga, creiamo un ByteArrayOutputStream , che si espanderà dinamicamente man mano che vengono aggiunti nuovi dati (come un ArrayList)."

"Nella riga 4, creiamo un ObjectOutputStream , che viene utilizzato per la serializzazione."

"Nella riga 5 serializziamo objectOriginal in un array di byte usando outputStream e lo salviamo in writeBuffer ."

"Nella riga 8, convertiamo writeBuffer in un normale array di byte. Successivamente 'leggeremo' il nostro nuovo oggetto da questo array."

"Nella riga 9, trasformiamo il buffer in un ByteArrayInputStream per leggerlo come un InputStream."

"Nella riga 10, passiamo readBuffer al costruttore ObjectInputStream per leggere (deserializzare) l'oggetto."

"Nella riga 11, leggiamo il nostro oggetto e lo convertiamo in un BigObject ."

"Cosa ne pensi?"

"È bellissimo."

"E comunque, quando il codice è evidenziato con colori diversi, è molto più facile da capire."