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

