CloneableBySerialization.java

De Feliwiki

/*
 * CloneableBySerialization.java
 * 
 * 25 de Maio de 2006, 13:52
 */

package br.eti.fml.struct;

import java.io.*;

/**
 * É capaz de fazer uma cópia de si mesmo através
 * de serialização na memória. Quem derivar desta classe faz
 * com que o método {@link #clone()} faça uma cópia "inteira", profunda
 * (deep copy) e não somente uma cópia superficial (shallow copy).
 * Veja <a href="http://www.javabeat.net/qna/11-what-is-the-difference-between-cloneable-and-serialization-of-an-object/">What
 * is the difference between cloneable and serialization of an object?</a>
 * para entender a diferença.
 *
 * @author Felipe Micaroni Lalli (micaroni@gmail.com)
 */
public abstract class CloneableBySerialization<T>
        implements java.io.Serializable
{    
    @SuppressWarnings("unchecked")
    @Override
    public T clone() {
        T copia = null;
        
        try {
            ByteArrayOutputStream baos = new ByteArrayOutputStream();

            ObjectOutputStream oos = new ObjectOutputStream(baos);
            oos.writeUnshared(this);
            oos.close();

            byte[] bytes = baos.toByteArray();
            baos.close();

            ByteArrayInputStream bais = new ByteArrayInputStream(bytes);          
            ObjectInputStream ois = new ObjectInputStream(bais);

            copia = (T) ois.readUnshared();

            ois.close();
            bais.close();

        } catch (Exception e) {
            System.err.println(
                    "Erro ao clonar! Sou do tipo: " + this.getClass()
                    + " e o tipo de erro foi: " + e);

            e.printStackTrace();
        }

        return copia;
    }
}

[editar] Veja também