Creating shallow copy vs deep copy in Java

This commit is contained in:
technoddy 2023-03-19 13:32:11 -04:00
parent 6cf8a16999
commit 73c2c6bc67
4 changed files with 178 additions and 0 deletions

View File

@ -0,0 +1,58 @@
package com.baeldung.shallowvsdeepcopy;
class Address implements Cloneable{
private String streetName;
private String zipCode;
private String cityName;
private String country;
public Address(String streetName, String zipCode, String cityName, String country) {
this.streetName = streetName;
this.zipCode = zipCode;
this.cityName = cityName;
this.country = country;
}
public String getStreetName() {
return streetName;
}
public void setStreetName(String streetName) {
this.streetName = streetName;
}
public String getZipCode() {
return zipCode;
}
public void setZipCode(String zipCode) {
this.zipCode = zipCode;
}
public String getCityName() {
return cityName;
}
public void setCityName(String cityName) {
this.cityName = cityName;
}
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
}
@Override
public Address clone() {
try {
Address clone = (Address) super.clone();
return clone;
} catch (CloneNotSupportedException e) {
throw new AssertionError();
}
}
}

View File

@ -0,0 +1,49 @@
package com.baeldung.shallowvsdeepcopy;
public class UserWithDeepClone implements Cloneable{
private String name;
private Address address;
private int age;
public UserWithDeepClone(String name, Address address, int age) {
this.name = name;
this.address = address;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public UserWithDeepClone clone() {
try {
UserWithDeepClone clone = (UserWithDeepClone) super.clone();
clone.setAddress(clone.getAddress().clone());
return clone;
} catch (CloneNotSupportedException e) {
throw new AssertionError();
}
}
}

View File

@ -0,0 +1,48 @@
package com.baeldung.shallowvsdeepcopy;
public class UserWithShallowClone implements Cloneable{
private String name;
private Address address;
private int age;
public UserWithShallowClone(String name, Address address, int age) {
this.name = name;
this.address = address;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public UserWithShallowClone clone() {
try {
UserWithShallowClone clone = (UserWithShallowClone) super.clone();
return clone;
} catch (CloneNotSupportedException e) {
throw new AssertionError();
}
}
}

View File

@ -0,0 +1,23 @@
package com.baeldung.shallowvsdeepcopy;
import org.junit.Test;
import static org.assertj.core.api.Assertions.assertThat;
public class UserCloneUnitTest {
@Test
public void givenUser_WhenCopyCreated_thenCopyIsShallow(){
Address address = new Address("abc", "444-0000", "pqr", "USA");
UserWithShallowClone user = new UserWithShallowClone("baeldung", address,32);
UserWithShallowClone userClone = (UserWithShallowClone)user.clone();
assertThat(userClone.getAddress()).isEqualTo(user.getAddress());
}
@Test
public void givenUserWithDeepCloneMethod_WhenCopyCreated_thenCopyIsDeep(){
Address address = new Address("abc", "444-0000", "pqr", "USA");
UserWithDeepClone user = new UserWithDeepClone("baeldung", address,32);
UserWithDeepClone userClone = (UserWithDeepClone)user.clone();
assertThat(userClone.getAddress()).isNotEqualTo(user.getAddress());
}
}