diff --git a/core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/deep_shallow_copy/Author.java b/core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/deep_shallow_copy/Author.java new file mode 100644 index 000000000000..9018b581f76a --- /dev/null +++ b/core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/deep_shallow_copy/Author.java @@ -0,0 +1,31 @@ +package com.baeldung.deep_shallow_copy; + +/** + * @author amitkumar + */ + +public class Author { + private String firstName; + private String lastName; + + public Author(String firstName, String lastName) { + this.firstName = firstName; + this.lastName = lastName; + } + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } +} diff --git a/core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/deep_shallow_copy/Blog.java b/core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/deep_shallow_copy/Blog.java new file mode 100644 index 000000000000..f33033f79594 --- /dev/null +++ b/core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/deep_shallow_copy/Blog.java @@ -0,0 +1,55 @@ +package com.baeldung.deep_shallow_copy; + +/** + * @author amitkumar + */ +public class Blog implements Cloneable { + private String title; + private String content; + private Author author; + + public Blog(String title, String content, Author author) { + this.title = title; + this.content = content; + this.author = author; + } + + public Blog createCopy() { + Author author = this.getAuthor(); + return new Blog(this.getTitle(), this.getContent(), new Author(author.getFirstName(), author.getLastName())); + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + + public Author getAuthor() { + return author; + } + + public void setAuthor(Author author) { + this.author = author; + } + + @Override + protected Object clone() throws CloneNotSupportedException { + Author author = new Author(this.getAuthor() + .getFirstName(), this.getAuthor() + .getLastName()); + Blog cloned = (Blog) super.clone(); + cloned.setAuthor(author); + return cloned; + } +} diff --git a/core-java-modules/core-java-lang-oop-patterns/src/test/java/com/baeldung/deep_shallow_copy/BlogTest.java b/core-java-modules/core-java-lang-oop-patterns/src/test/java/com/baeldung/deep_shallow_copy/BlogTest.java new file mode 100644 index 000000000000..c9be46154567 --- /dev/null +++ b/core-java-modules/core-java-lang-oop-patterns/src/test/java/com/baeldung/deep_shallow_copy/BlogTest.java @@ -0,0 +1,88 @@ +package com.baeldung.deep_shallow_copy; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotEquals; + +import org.junit.jupiter.api.Test; + +/** + * @author amitkumar + */ +class BlogTest { + + @Test + public void whenObjectIsCopiedUsingReference_thenShallowCopyIsCreated() { + Blog blog = new Blog("Effective Jave", "some content", new Author("Joshua", "Bloch")); + Blog newBlog = blog; + assertEquals(blog.getContent(), newBlog.getContent()); + assertEquals(blog.getTitle(), newBlog.getTitle()); + assertEquals(blog.getAuthor() + .getFirstName(), newBlog.getAuthor() + .getFirstName()); + assertEquals(blog.getAuthor() + .getLastName(), newBlog.getAuthor() + .getLastName()); + blog.setContent("new Content"); + assertEquals(blog.getContent(), newBlog.getContent()); + newBlog.setTitle("new Title"); + assertEquals(blog.getTitle(), newBlog.getTitle()); + } + + @Test + public void whenObjectIsCopiedUsingCopyConstructor_thenDeepCopyIsCreated() { + Blog blog = new Blog("Effective Jave", "some content", new Author("Joshua", "Bloch")); + Blog newBlog = blog.createCopy(); + assertEquals(blog.getContent(), newBlog.getContent()); + assertEquals(blog.getTitle(), newBlog.getTitle()); + assertEquals(blog.getAuthor() + .getFirstName(), newBlog.getAuthor() + .getFirstName()); + assertEquals(blog.getAuthor() + .getLastName(), newBlog.getAuthor() + .getLastName()); + blog.setContent("new Content"); + assertNotEquals(blog.getContent(), newBlog.getContent()); + newBlog.setTitle("new Title"); + assertNotEquals(blog.getTitle(), newBlog.getTitle()); + } + + @Test + public void whenObjectIsCopiedUsingDefaultOverriddenCloneMethod_thenShallowCopyIsCreated() throws CloneNotSupportedException { + Blog blog = new Blog("Effective Jave", "some content", new Author("Joshua", "Bloch")); + Blog newBlog = (Blog) blog.clone(); + assertEquals(blog.getContent(), newBlog.getContent()); + assertEquals(blog.getTitle(), newBlog.getTitle()); + assertEquals(blog.getAuthor() + .getFirstName(), newBlog.getAuthor() + .getFirstName()); + assertEquals(blog.getAuthor() + .getLastName(), newBlog.getAuthor() + .getLastName()); + blog.getAuthor() + .setLastName("last name"); + assertNotEquals(blog.getAuthor() + .getLastName(), newBlog.getAuthor() + .getLastName()); + } + + @Test + public void whenObjectIsCopiedUsingCustomOverriddenCloneMethod_thenDeepCopyIsCreated() { + Blog blog = new Blog("Effective Jave", "some content", new Author("Joshua", "Bloch")); + Blog newBlog = blog.createCopy(); + assertEquals(blog.getContent(), newBlog.getContent()); + assertEquals(blog.getTitle(), newBlog.getTitle()); + assertEquals(blog.getAuthor() + .getFirstName(), newBlog.getAuthor() + .getFirstName()); + assertEquals(blog.getAuthor() + .getLastName(), newBlog.getAuthor() + .getLastName()); + blog.setContent("new Content"); + assertNotEquals(blog.getContent(), newBlog.getContent()); + newBlog.setTitle("new Title"); + assertNotEquals(blog.getTitle(), newBlog.getTitle()); + blog.getAuthor().setLastName("last name"); + assertNotEquals(blog.getAuthor().getLastName(), newBlog.getAuthor().getLastName()); + } + +} \ No newline at end of file