用Java复制构造函数

时间:2020-02-23 14:34:01  来源:igfitidea点击:

java类中的Copy构造函数是一种特殊的构造函数类型,它使用相同的类作为参数。
复制构造函数用于提供指定对象的副本。

用Java复制构造函数

复制构造函数是Java克隆机制的简单替代方案。

当我们要复制要实例化的对象时,复制构造函数很有用。
在编写副本构造函数时,执行深度复制非常重要,这样才能分离两个对象。
但是,在某些情况下,您不介意对象数据的更改,那么您也可以进行浅表复制。

让我们看看如何在Java中正确编写一个复制构造函数并执行对象的深层复制。

package com.theitroad.copyconstructor;

import java.util.ArrayList;
import java.util.List;

import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;

@Data
@NoArgsConstructor
@ToString
public class State {

	private List<String> cities;
	private String name;
	private String country;
		
	public State(State st) {
		this.name = st.name; //string is immutable, so we can do direct assignment
		this.country = st.country;

		List<String> ct = new ArrayList<>();
		for (String c : st.cities) {
			ct.add(c);
		}
		this.cities = ct;
	}
}

请注意,我正在使用lombok项目,因此不必编写样板代码。

这是一个使用复制构造函数的简单测试类。

package com.theitroad.copyconstructor;

import java.util.ArrayList;
import java.util.List;

public class StateTest {

	public static void main(String[] args) {
		State state = getState();
		State stateCopy = new State(state);
		System.out.println("State = "+state);
		System.out.println("StateCopy = "+stateCopy);

		stateCopy.getCities().add("Cupertino");
		stateCopy.setCountry("United States of America");
		
		System.out.println("State = "+state);
		System.out.println("StateCopy = "+stateCopy);

	}

	private static State getState() {
		//in real life, it will do some DB call or expensive API
		//class to fetch the data
		State state = new State();
		state.setName("California");
		state.setCountry("USA");
		List<String> cities = new ArrayList<>();
		cities.add("San Jose"); cities.add("San Francisco");
		state.setCities(cities);
		return state;
	}

	
}

请注意,我正在更改其中一个对象的某些属性,如果我们的深层复制实现正确完成,则它不会影响另一个对象。
让我们运行上面的程序并检查输出。

State = State(cities=[San Jose, San Francisco], name=California, country=USA)
StateCopy = State(cities=[San Jose, San Francisco], name=California, country=USA)

State = State(cities=[San Jose, San Francisco], name=California, country=USA)
StateCopy = State(cities=[San Jose, San Francisco, Cupertino], name=California, country=United States of America)

从输出中可以明显看出,我们的复制构造函数实现是正确的,其中一个对象的更改未影响另一个对象,并且我们的深层复制实现是正确的。