Interfaces de marcador e cópias profundas - 1

"Olá, amigo!"

"Oi, Bilaabo!"

"Hoje falarei sobre interfaces de marcadores ."

"Interfaces marcadoras são interfaces sem métodos. Quando uma classe implementa tal interface, dizemos que ela é marcada por ela."

"Exemplos dessas interfaces incluem: Cloneable, Serializable, Remote ."

"A interface Serializable é usada para marcar classes que oferecem suporte à serialização, indicando que as instâncias dessas classes podem ser serializadas e desserializadas automaticamente."

"A interface remota é usada para identificar objetos que suportam execução remota, ou seja, métodos que podem ser chamados de outra máquina virtual Java e/ou computador diferente."

"A interface Cloneable é usada para marcar classes que suportam clonagem."

"Ah, sobre clonagem ou cópia."

"Existem dois tipos de cópia: superficial e profunda."

" A cópia rasa é a criação de uma cópia de um objeto, sem duplicar nenhum dos objetos aos quais ele faz referência."

" A cópia profunda envolve a duplicação de um objeto, incluindo os objetos aos quais ele faz referência e os objetos aos quais esses objetos fazem referência, etc."

"Existe uma maneira realmente boa de criar um clone profundo de forma confiável."

"Esse método funciona mesmo que os desenvolvedores tenham esquecido de marcar uma classe como Cloneable. "O único requisito é que os objetos sejam serializáveis."

"Aqui está como você faz:"

1) Crie um buffer (matriz de bytes) na memória.

2) Serialize o objeto e os subobjetos no buffer.

3) Desserialize a hierarquia de objetos salva no buffer.

Código
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();

"Na primeira linha, criamos objectOriginal , que iremos clonar. O objeto e todos os seus subobjetos devem suportar a serialização."

"Na terceira linha, criamos um ByteArrayOutputStream , que se expandirá dinamicamente à medida que novos dados forem adicionados (como um ArrayList)."

"Na linha 4, criamos um ObjectOutputStream , que é usado para serialização."

"Na linha 5, serializamos objectOriginal em uma matriz de bytes usando outputStream e salvamos em writeBuffer ."

"Na linha 8, convertemos writeBuffer em um array de bytes comum. Mais tarde, 'leremos' nosso novo objeto a partir desse array."

"Na linha 9, transformamos o buffer em um ByteArrayInputStream para lê-lo como um InputStream."

"Na linha 10, passamos readBuffer para o construtor ObjectInputStream para ler (desserializar) o objeto."

"Na linha 11, lemos nosso objeto e o convertemos em um BigObject ."

"O que você acha?"

"É lindo."

"E, a propósito, quando o código é destacado em cores diferentes, fica muito mais fácil de entender."