【javaSE】Cloneable

package com.javase.cloneable;

//http://blog.csdn.net/kenthong/article/details/5758884

//http://www.itzhai.com/java-based-notebook-the-object-of-deep-and-shallow-copy-copy-copy-implement-the-cloneable-interface-serializing-deep-deep-copy.html


public class Test_Cloneable {

	public static void main(String[] args) throws CloneNotSupportedException {
//		testClone();
		
		testCloneForSerializable();   
	}

	private static void testCloneForSerializable() {
		//實現了:Serializable
		AdminSeri src = new AdminSeri("admin", new Userseri("user", "20"));  
		AdminSeri dist = BeanUtil.cloneTo(src);     
		
		System.out.println(src == dist);			// false
		System.out.println(src.equals(dist));		// true

		System.out.println(src.getUser() == dist.getUser());		//false ! Well done!
		System.out.println(src.getUser().equals(dist.getUser()));	//true  
	}

	private static void testClone() throws CloneNotSupportedException {
		User u1 = new User("jack", "20");
		User u2 = u1;
		User u3 = (User) u1.clone();
		
		System.out.println(u1 == u2);
		System.out.println(u1 == u3);
		System.out.println(u1.equals(u3)); 
		
		System.out.println("==============================================");   
		
		Admin a1 = new Admin("ad", new User("u1", "20"));   
		Admin a2 = a1; 
		Admin a3 = (Admin) a1.clone();
		
		System.out.println(a1 == a3);
		System.out.println(a1.equals(a3));  
		System.out.println(a1.getUser() == a3.getUser());  //咱們不但願這是相等的.這裏是淺拷貝
		System.out.println(a1.getUser().equals(a3.getUser()))  ;     
		
		System.out.println(a1.getUser().getName() == a3.getUser().getName())  ;    
		a1.getUser().setName("u2");  
		System.out.println(a1.getUser().getName() == a3.getUser().getName())  ;    
		System.out.println(a3.getUser().getName()); 
	}
}


Admin.javahtml

package com.javase.cloneable;

public class Admin implements Cloneable{

	private String name;
	private User user;

	public Admin(String name, User user) {
		this.name = name;
		this.user = user;
	}
	public Admin() {
	}
	/**
	淺拷貝 	
	@Override
	protected Object clone() throws CloneNotSupportedException {
		return super.clone();
	}
    */
	
	/**
	 * 深拷貝
	 */
	@Override
	protected Object clone() throws CloneNotSupportedException {
		Admin admin = (Admin) super.clone();
		admin.user = (User) admin.user.clone();   
		return admin;
	}
	
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		result = prime * result + ((user == null) ? 0 : user.hashCode());
		return result;
	}
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Admin other = (Admin) obj;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		if (user == null) {
			if (other.user != null)
				return false;
		} else if (!user.equals(other.user))
			return false;
		return true;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public User getUser() {
		return user;
	}
	public void setUser(User user) {
		this.user = user;
	}
	
	
}

AdminSeri.javajava

package com.javase.cloneable;

import java.io.Serializable;

public class AdminSeri implements Serializable  {  

	private static final long serialVersionUID = 1L;
	private String name;
	private Userseri user;

	public AdminSeri(String name, Userseri user) {
		this.name = name;
		this.user = user;
	}
	public AdminSeri() {
	}
	 
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		result = prime * result + ((user == null) ? 0 : user.hashCode());
		return result;
	}
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		AdminSeri other = (AdminSeri) obj;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		if (user == null) {
			if (other.user != null)
				return false;
		} else if (!user.equals(other.user))
			return false;
		return true;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Userseri getUser() {
		return user;
	}
	public void setUser(Userseri user) {
		this.user = user;
	}
	
	
}

BeanUtil.javaide

package com.javase.cloneable;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

public abstract class BeanUtil {
	@SuppressWarnings("unchecked")
	public static <T> T cloneTo(T src) throws RuntimeException {
		ByteArrayOutputStream memoryBuffer = new ByteArrayOutputStream();
		ObjectOutputStream out = null;
		ObjectInputStream in = null;
		T dist = null;
		try {
			out = new ObjectOutputStream(memoryBuffer);
			out.writeObject(src);
			out.flush();
			in = new ObjectInputStream(new ByteArrayInputStream(memoryBuffer.toByteArray()));
			dist = (T) in.readObject();
		} catch (Exception e) {
			throw new RuntimeException(e);
		} finally {
			if (out != null)
				try {
					out.close();
					out = null;
				} catch (IOException e) {
					throw new RuntimeException(e);
				}
			if (in != null)
				try {
					in.close();
					in = null;
				} catch (IOException e) {
					throw new RuntimeException(e);
				}
		}
		return dist;
	}

}

User.javathis

package com.javase.cloneable;

public class User implements Cloneable{

	private String name;
	private String age;
	
	public User(){};

	public User(String name, String age) {
		this.name = name;
		this.age = age;
	}

	@Override
	protected Object clone() throws CloneNotSupportedException {
		return super.clone();
	}
	
	
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((age == null) ? 0 : age.hashCode());
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		User other = (User) obj;
		if (age == null) {
			if (other.age != null)
				return false;
		} else if (!age.equals(other.age))
			return false;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		return true;
	}



	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getAge() {
		return age;
	}
	public void setAge(String age) {
		this.age = age;
	}
}

Userseri.java.net

package com.javase.cloneable;

import java.io.Serializable;

public class Userseri implements Serializable{
	private static final long serialVersionUID = 4546638476836460643L;
	private String name;
	private String age;
	
	public Userseri(){};

	public Userseri(String name, String age) {
		this.name = name;
		this.age = age;
	}
	
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((age == null) ? 0 : age.hashCode());
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Userseri other = (Userseri) obj;
		if (age == null) {
			if (other.age != null)
				return false;
		} else if (!age.equals(other.age))
			return false;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		return true;
	}



	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getAge() {
		return age;
	}
	public void setAge(String age) {
		this.age = age;
	}
}
相關文章
相關標籤/搜索