这是indexloc提供的服务,不要输入任何密码
Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -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;
}
}
Original file line number Diff line number Diff line change
@@ -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;
}
}
Original file line number Diff line number Diff line change
@@ -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());
}

}