Bộ sưu tập

Sao chép đối tượng trong java


https://codersontrang.com/2012/12/14/sao-chep-doi-tuong-trong-java/

Khi chúng ta muốn lấy ra bản sao của một đối tượng thường chúng ta có nhiều cách để thực hiện. Có một cách vẫn thường hay được dùng đó là làm theo mẫu thiết kế prototype, bài viết này xin đóng góp một cách khác bằng việc sử dụng những thư viện có sẵn của java IO. Một lớp tiện ích là ObjectCopier có thể được tạo ra và có phương thức copy để sao chép một đối tượng truyền vào như sau.

ObjectCopier.java

package com.wordpress.hautudu.objectcopy;

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

public class ObjectCopier {
	private ObjectCopier(){}
	public static Object copy(Object obj){
		if(obj == null) return null;
		try{
			ByteArrayOutputStream baos = new ByteArrayOutputStream();
			ObjectOutputStream oos = new ObjectOutputStream(baos);
			oos.writeObject(obj);
			
			byte [] arrays = baos.toByteArray();
			
			ByteArrayInputStream bais = new ByteArrayInputStream(arrays);
			ObjectInputStream ois = new ObjectInputStream(bais);
			return ois.readObject();
		}catch(Exception e){
			throw new RuntimeException("Error when copying object");
		}
	}
}

Có một điều phải chú ý đó là các đối tượng muốn sao chép được, kiểu của chúng phải cài đặt interface java.io.Serializable . Dưới đây sẽ là một ví dụ cho việc sử dụng lớp tiện ích trên. Trong ví dụ này chúng ta sẽ có hai lớp là Computer và Programmer, mỗi Programmer sẽ sở hữu một Computer

Computer.java


package com.wordpress.hautudu.objectcopy;

import java.io.Serializable;

public class Computer implements Serializable{
	private String name;
	
	public Computer (String name){
		this.name = name;
	}
	
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
}

Programmer.java


package com.wordpress.hautudu.objectcopy;

import java.io.Serializable;

public class Programmer implements Serializable{
	private String name;
	private int age;
	private Computer computer;
	
	public Programmer(String name, int age, Computer computer){
		this.name = name;
		this.age = age;
		this.computer = computer;
	}
	
	public String introduceMySelft(){
		return "I am "+name+", "+age+" years old. I own computer named "+computer.getName();
	}
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public Computer getComputer() {
		return computer;
	}
	public void setComputer(Computer computer) {
		this.computer = computer;
	}
}

Và một lớp Test.java là điểm bắt đầu cho chương trình
Test.java


package com.wordpress.hautudu.objectcopy;

public class Test {
	public static void main(String [] args){
		Computer computer = new Computer("Lenovo Thinkpad T410");
		Programmer programmer1 = new Programmer("Voc con", 100, computer);
		Programmer programmer2 = (Programmer) ObjectCopier.copy(programmer1);
		
		System.out.println("First stage:");
		System.out.println("Programmer 1: "+programmer1.introduceMySelft());
		System.out.println("Programmer 2: "+programmer2.introduceMySelft());
		
		programmer2.setName("Voc to");
		programmer2.setAge(101);
		programmer2.getComputer().setName("Apple Ipad 2");
		
		System.out.println("Second stage:");
		System.out.println("Programmer 1: "+programmer1.introduceMySelft());
		System.out.println("Programmer 2: "+programmer2.introduceMySelft());
	}
}

Kết quả khi chạy chương trình


First stage:
Programmer 1: I am Voc con, 100 years old. I own computer named Lenovo Thinkpad T410
Programmer 2: I am Voc con, 100 years old. I own computer named Lenovo Thinkpad T410
Second stage:
Programmer 1: I am Voc con, 100 years old. I own computer named Lenovo Thinkpad T410
Programmer 2: I am Voc to, 101 years old. I own computer named Apple Ipad 2

Trong kết quả ta có thể thấy được là programmer2 lúc đầu được copy y nguyên như programmer1. Sau khi ta thay đổi một vài dữ liệu của programmer2 thì dữ liệu của programmer1 không thay đổi. Điều này có nghĩa là programmer1 và programmer2 đang tham chiếu tới hai đối tượng riêng biệt trong bộ nhớ.

Advertisements

Trả lời

Mời bạn điền thông tin vào ô dưới đây hoặc kích vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Đăng xuất /  Thay đổi )

Google photo

Bạn đang bình luận bằng tài khoản Google Đăng xuất /  Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Đăng xuất /  Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Đăng xuất /  Thay đổi )

Connecting to %s