From 13448aa5513890351319bc9db861eb101888d802 Mon Sep 17 00:00:00 2001 From: Andrei Branza Date: Thu, 22 Feb 2024 11:49:07 +0200 Subject: [PATCH] Andrei Branza - test article shallowCopy-vs-deepCopy --- .../shallowCopy-vs-deepCopy/.gitignore | 38 +++++++++++++++++++ .../shallowCopy-vs-deepCopy/pom.xml | 33 ++++++++++++++++ .../com/baeldung/cloning/deep/Address.java | 25 ++++++++++++ .../com/baeldung/cloning/deep/Person.java | 28 ++++++++++++++ .../com/baeldung/cloning/shallow/Address.java | 25 ++++++++++++ .../com/baeldung/cloning/shallow/Person.java | 24 ++++++++++++ .../cloning/deep/DeepCloningTest.java | 23 +++++++++++ .../cloning/shallow/ShallowCloningTest.java | 21 ++++++++++ 8 files changed, 217 insertions(+) create mode 100644 xxAndreiBranza/shallowCopy-vs-deepCopy/.gitignore create mode 100644 xxAndreiBranza/shallowCopy-vs-deepCopy/pom.xml create mode 100644 xxAndreiBranza/shallowCopy-vs-deepCopy/src/main/java/com/baeldung/cloning/deep/Address.java create mode 100644 xxAndreiBranza/shallowCopy-vs-deepCopy/src/main/java/com/baeldung/cloning/deep/Person.java create mode 100644 xxAndreiBranza/shallowCopy-vs-deepCopy/src/main/java/com/baeldung/cloning/shallow/Address.java create mode 100644 xxAndreiBranza/shallowCopy-vs-deepCopy/src/main/java/com/baeldung/cloning/shallow/Person.java create mode 100644 xxAndreiBranza/shallowCopy-vs-deepCopy/src/test/java/com/baeldung/cloning/deep/DeepCloningTest.java create mode 100644 xxAndreiBranza/shallowCopy-vs-deepCopy/src/test/java/com/baeldung/cloning/shallow/ShallowCloningTest.java diff --git a/xxAndreiBranza/shallowCopy-vs-deepCopy/.gitignore b/xxAndreiBranza/shallowCopy-vs-deepCopy/.gitignore new file mode 100644 index 0000000000..5ff6309b71 --- /dev/null +++ b/xxAndreiBranza/shallowCopy-vs-deepCopy/.gitignore @@ -0,0 +1,38 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/xxAndreiBranza/shallowCopy-vs-deepCopy/pom.xml b/xxAndreiBranza/shallowCopy-vs-deepCopy/pom.xml new file mode 100644 index 0000000000..e6848cfacc --- /dev/null +++ b/xxAndreiBranza/shallowCopy-vs-deepCopy/pom.xml @@ -0,0 +1,33 @@ + + + 4.0.0 + + com.baeldung + shallowCopy-vs-deepCopy + 1.0-SNAPSHOT + + + 21 + 4.13.2 + test + ${java.version} + ${java.version} + UTF-8 + + + + junit + junit + ${junit.version} + ${test.scope + + + org.projectlombok + lombok + 1.18.30 + provided + + + \ No newline at end of file diff --git a/xxAndreiBranza/shallowCopy-vs-deepCopy/src/main/java/com/baeldung/cloning/deep/Address.java b/xxAndreiBranza/shallowCopy-vs-deepCopy/src/main/java/com/baeldung/cloning/deep/Address.java new file mode 100644 index 0000000000..0439c74f3a --- /dev/null +++ b/xxAndreiBranza/shallowCopy-vs-deepCopy/src/main/java/com/baeldung/cloning/deep/Address.java @@ -0,0 +1,25 @@ +package com.baeldung.cloning.deep; + +import lombok.*; + +@Getter +@Setter +@AllArgsConstructor +@EqualsAndHashCode +@ToString +public class Address implements Cloneable +{ + private String streetName; + private String cityName; + + @Override + public Address clone() { + try + { + return (Address) super.clone(); + } catch (CloneNotSupportedException cloneException) + { + throw new RuntimeException(cloneException); + } + } +} \ No newline at end of file diff --git a/xxAndreiBranza/shallowCopy-vs-deepCopy/src/main/java/com/baeldung/cloning/deep/Person.java b/xxAndreiBranza/shallowCopy-vs-deepCopy/src/main/java/com/baeldung/cloning/deep/Person.java new file mode 100644 index 0000000000..2088d538ea --- /dev/null +++ b/xxAndreiBranza/shallowCopy-vs-deepCopy/src/main/java/com/baeldung/cloning/deep/Person.java @@ -0,0 +1,28 @@ +package com.baeldung.cloning.deep; + +import lombok.*; + +@Getter +@Setter +@AllArgsConstructor +@EqualsAndHashCode +@ToString +public class Person implements Cloneable +{ + private String firstName; + private String lastName; + private Address address; + + public Person(Person personToBeCloned) { + Address addressToBeCloned = personToBeCloned.getAddress(); + + this.firstName = personToBeCloned.getFirstName(); + this.lastName = personToBeCloned.getLastName(); + this.address = new Address(addressToBeCloned.getStreetName(), addressToBeCloned.getCityName()); + } + + @Override + public Person clone() { + return new Person(this); + } +} diff --git a/xxAndreiBranza/shallowCopy-vs-deepCopy/src/main/java/com/baeldung/cloning/shallow/Address.java b/xxAndreiBranza/shallowCopy-vs-deepCopy/src/main/java/com/baeldung/cloning/shallow/Address.java new file mode 100644 index 0000000000..9c79ed3383 --- /dev/null +++ b/xxAndreiBranza/shallowCopy-vs-deepCopy/src/main/java/com/baeldung/cloning/shallow/Address.java @@ -0,0 +1,25 @@ +package com.baeldung.cloning.shallow; + +import lombok.*; + +@Getter +@Setter +@AllArgsConstructor +@EqualsAndHashCode +@ToString +public class Address implements Cloneable +{ + private String streetName; + private String cityName; + + @Override + public Address clone() { + try + { + return (Address) super.clone(); + } catch (CloneNotSupportedException cloneException) + { + throw new RuntimeException(cloneException); + } + } +} \ No newline at end of file diff --git a/xxAndreiBranza/shallowCopy-vs-deepCopy/src/main/java/com/baeldung/cloning/shallow/Person.java b/xxAndreiBranza/shallowCopy-vs-deepCopy/src/main/java/com/baeldung/cloning/shallow/Person.java new file mode 100644 index 0000000000..6b2165d72c --- /dev/null +++ b/xxAndreiBranza/shallowCopy-vs-deepCopy/src/main/java/com/baeldung/cloning/shallow/Person.java @@ -0,0 +1,24 @@ +package com.baeldung.cloning.shallow; + +import lombok.*; + +@Getter +@Setter +@AllArgsConstructor +@EqualsAndHashCode +@ToString +public class Person implements Cloneable +{ + private String firstName; + private String lastName; + private Address address; + + @Override + public Person clone() { + try { + return (Person) super.clone(); + } catch (CloneNotSupportedException cloneException) { + throw new RuntimeException(cloneException); + } + } +} diff --git a/xxAndreiBranza/shallowCopy-vs-deepCopy/src/test/java/com/baeldung/cloning/deep/DeepCloningTest.java b/xxAndreiBranza/shallowCopy-vs-deepCopy/src/test/java/com/baeldung/cloning/deep/DeepCloningTest.java new file mode 100644 index 0000000000..4b9d14fa9c --- /dev/null +++ b/xxAndreiBranza/shallowCopy-vs-deepCopy/src/test/java/com/baeldung/cloning/deep/DeepCloningTest.java @@ -0,0 +1,23 @@ +package com.baeldung.cloning.deep; + +import org.junit.Test; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotEquals; + +public class DeepCloningTest { + + Person alex = new Person("Alex", "Jones", new Address("Main Street", "Main City")); + + @Test + public void whenUsingDeepCopy_thenReferencesAreNotTheSame() + { + Person constructorCopyOfAlex = new Person(alex); + + assertEquals(alex, constructorCopyOfAlex); + + alex.setAddress(new Address("Unknown Street", "Unknown City")); + + assertNotEquals(alex.getAddress(), constructorCopyOfAlex.getAddress()); + } +} diff --git a/xxAndreiBranza/shallowCopy-vs-deepCopy/src/test/java/com/baeldung/cloning/shallow/ShallowCloningTest.java b/xxAndreiBranza/shallowCopy-vs-deepCopy/src/test/java/com/baeldung/cloning/shallow/ShallowCloningTest.java new file mode 100644 index 0000000000..b513919911 --- /dev/null +++ b/xxAndreiBranza/shallowCopy-vs-deepCopy/src/test/java/com/baeldung/cloning/shallow/ShallowCloningTest.java @@ -0,0 +1,21 @@ +package com.baeldung.cloning.shallow; + +import org.junit.Test; +import static org.junit.Assert.*; + +public class ShallowCloningTest { + + Person alex = new Person("Alex", "Jones", new Address("Main Street", "Main City")); + + @Test + public void whenUsingShallowCopy_ThenReferencesAreTheSame() + { + Person shallowCopyOfAlex = alex.clone(); + + assertEquals(alex, shallowCopyOfAlex); + + alex.getAddress().setCityName("Unknown City"); + + assertEquals(alex.getAddress(), shallowCopyOfAlex.getAddress()); + } +}