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