/home/wpollock1/public_html/AJava/DeepCopy.java
// Found at <http://javatechniques.com/blog/faster-deep-copies-of-java-objects/>.
// Read on 10/19/2010. Author: Philip Isenhour
//
// Adapted (and modified) on 10/2010 by Wayne Pollock, Tampa Florida USA
import java.io.*;
import java.util.*;
/**
* Utility for making deep copies (vs. clone()'s shallow copies) of
* objects. Objects are first serialized and then deserialized. Error
* checking is fairly minimal in this implementation. If an object is
* encountered that cannot be serialized (or that references an object
* that cannot be serialized) an error is printed to System.err and
* null is returned. Depending on your specific application, it might
* make more sense to re-throw the (caught) exception.
*/
public class DeepCopy {
/**
* Returns a copy of the object, or null if the object cannot
* be serialized.
*/
public static Object copy ( Object orig ) {
Object obj = null;
try {
// Write the object out to a byte array:
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream out = new ObjectOutputStream(bos);
out.writeObject(orig);
out.flush();
out.close();
// Make an input stream from the byte array and read
// a copy of the object back in:
ObjectInputStream in = new ObjectInputStream(
new ByteArrayInputStream(bos.toByteArray()));
obj = in.readObject();
}
catch(IOException e) {
e.printStackTrace();
}
catch(ClassNotFoundException cnfe) {
cnfe.printStackTrace();
}
return obj;
}
}
// Test class: makes an array of Date objects, tries to deepCopy it:
class DeepCopyDemo {
@SuppressWarnings("deprecation") // For Date.setYear
public static void main ( String [] args ) {
Date [] dates = new Date[]{ new Date(), new Date() };
Date [] dateCopy = (Date[]) DeepCopy.copy( dates );
// Now we change one of the date object in the original:
dates[1].setYear(101); // Sets the year to 2001
// Now see if the copy has the old or changed date:
System.out.println( "Original Date array: " + Arrays.toString( dates ) );
System.out.println( "Date array copy: " + Arrays.toString( dateCopy ) );
if ( dates[1].getYear() != dateCopy[1].getYear() )
System.out.println( "\nDeep copy successful!" );
else
System.out.println( "\nDeep copy failled (shallow copy was created)!" );
}
}