顾客:“给我几个快递。”快递员:“寄往什么地方?寄给...?”顾客:“和上次差很少同样,只是邮寄给另一个地址,这里是邮寄地址...“把邮寄地址的纸条给快递员。快递员:“好。”
public class PackageInfo implements Cloneable { public PackageInfo clone() { try { return (PackageInfo) super .clone(); } catch (CloneNotSupportedException e) { System. out .println( "Cloning not allowed." ); return null ; } } // 静态工厂方法:根据原型建立一份副本 public static PackageInfo clonePackage(String userName) { // 根据 userName加载一条用户之前的数据做为原型数据(数据库或其它保存的数据) PackageInfo prototype = loadPackageInfo (userName); // 再在内存中克隆这条数据 prototype = prototypr .clone(); // 初始化数据 id(主键) prototype. setId ( null ); // 返回数据 return prototype; } }
//DeepCopyBean实现了 java.io.Serializable接口 public class DeepCopyBean implements Serializable { // 原始类型属性 private int primitiveField ; // 对象属性 private String objectField ; // 首先序列化本身到流中,而后从流中反序列化,获得得对象即是一个新的深拷贝 public DeepCopyBean deepCopy() { try { ByteArrayOutputStream buf = new ByteArrayOutputStream(); ObjectOutputStream o = new ObjectOutputStream(buf); o.writeObject( this ); ObjectInputStream in = new ObjectInputStream( new ByteArrayInputStream(buf.toByteArray())); return (DeepCopyBean) in.readObject(); } catch (Exception e) { e.printStackTrace(); } return null ; } // 属性 get、set 方法略... // 测试demo public static void main(String[] args) { DeepCopyBean originalBean = new DeepCopyBean(); // 建立两个 String对象,其中一个在 JVM的字符串池(String pool)里,属性引用指向另一个在堆里的对象 originalBean.setObjectField( new String( "guilin" )); originalBean.setPrimitiveField(50); // 深拷贝 DeepCopyBean newBean = originalBean.deepCopy(); // 原始类型属性值比较:true System. out .println( "primitiveField ==:" + (originalBean.getPrimitiveField() == newBean .getPrimitiveField())); // 对象属性值比较:false(证实未指向相同的地址) System. out .println( "objectField ==:" + (originalBean.getObjectField() == newBean.getObjectField())); // 对象属性 equals 比较:true System. out .println( "objectField equal:" + (originalBean.getObjectField().equals(newBean .getObjectField()))); } }