BAEL-6633 (#14308)
* Deep copy of Arraylist * Deep copy of Arraylist * Deep copy of Arraylist updated as per review
This commit is contained in:
parent
de3fc4f21a
commit
1c12d45700
|
@ -0,0 +1,42 @@
|
||||||
|
package com.baeldung.deepcopyarraylist;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
public class Course implements Serializable, Cloneable {
|
||||||
|
|
||||||
|
private Integer courseId;
|
||||||
|
private String courseName;
|
||||||
|
|
||||||
|
public Course() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public Course(Integer courseId, String courseName) {
|
||||||
|
this.courseId = courseId;
|
||||||
|
this.courseName = courseName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getCourseId() {
|
||||||
|
return courseId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setCourseId(Integer courseId) {
|
||||||
|
this.courseId = courseId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getCourseName() {
|
||||||
|
return courseName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setCourseName(String courseName) {
|
||||||
|
this.courseName = courseName;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Course clone() {
|
||||||
|
try {
|
||||||
|
return (Course) super.clone();
|
||||||
|
} catch (CloneNotSupportedException e) {
|
||||||
|
throw new AssertionError();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,103 @@
|
||||||
|
package com.baeldung.deepcopyarraylist;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
import org.apache.commons.lang3.SerializationUtils;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.core.JsonProcessingException;
|
||||||
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
|
|
||||||
|
public class Student implements Serializable, Cloneable {
|
||||||
|
|
||||||
|
private int studentId;
|
||||||
|
private String studentName;
|
||||||
|
private Course course;
|
||||||
|
|
||||||
|
public Student() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public Student(int studentId, String studentName, Course course) {
|
||||||
|
this.studentId = studentId;
|
||||||
|
this.studentName = studentName;
|
||||||
|
this.course = course;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Student(Student student) {
|
||||||
|
this.studentId = student.getStudentId();
|
||||||
|
this.studentName = student.getStudentName();
|
||||||
|
this.course = new Course(student.getCourse()
|
||||||
|
.getCourseId(), student.getCourse()
|
||||||
|
.getCourseName());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Student createDeepCopy(Student student) {
|
||||||
|
ObjectMapper objectMapper = new ObjectMapper();
|
||||||
|
try {
|
||||||
|
return objectMapper.readValue(objectMapper.writeValueAsString(student), Student.class);
|
||||||
|
} catch (JsonProcessingException e) {
|
||||||
|
throw new IllegalArgumentException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static List<Student> deepCopyUsingJackson(List<Student> students) {
|
||||||
|
return students.stream()
|
||||||
|
.map(Student::createDeepCopy)
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static List<Student> deepCopyUsingCloneable(List<Student> students) {
|
||||||
|
return students.stream()
|
||||||
|
.map(Student::clone)
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static List<Student> deepCopyUsingCopyConstructor(List<Student> students) {
|
||||||
|
return students.stream()
|
||||||
|
.map(Student::new)
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static List<Student> deepCopyUsingSerialization(List<Student> students) {
|
||||||
|
return students.stream()
|
||||||
|
.map(SerializationUtils::clone)
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getStudentId() {
|
||||||
|
return studentId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setStudentId(int studentId) {
|
||||||
|
this.studentId = studentId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getStudentName() {
|
||||||
|
return studentName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setStudentName(String studentName) {
|
||||||
|
this.studentName = studentName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Course getCourse() {
|
||||||
|
return course;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setCourse(Course course) {
|
||||||
|
this.course = course;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Student clone() {
|
||||||
|
Student student;
|
||||||
|
try {
|
||||||
|
student = (Student) super.clone();
|
||||||
|
} catch (CloneNotSupportedException e) {
|
||||||
|
throw new AssertionError();
|
||||||
|
}
|
||||||
|
student.course = this.course.clone();
|
||||||
|
return student;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,77 @@
|
||||||
|
package com.baeldung.deepcopyarraylist;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.junit.jupiter.api.Assertions;
|
||||||
|
|
||||||
|
public class DeepCopyArrayListUnitTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenCreatingCopyWithCloneable_thenObjectsShouldNotBeSame() {
|
||||||
|
Course course = new Course(1, "Spring Masterclass");
|
||||||
|
Student student1 = new Student(1, "John", course);
|
||||||
|
Student student2 = new Student(2, "David", course);
|
||||||
|
List<Student> students = new ArrayList<>();
|
||||||
|
students.add(student1);
|
||||||
|
students.add(student2);
|
||||||
|
|
||||||
|
List<Student> deepCopy = Student.deepCopyUsingCloneable(students);
|
||||||
|
|
||||||
|
Assertions.assertNotEquals(students.get(0), deepCopy.get(0));
|
||||||
|
Assertions.assertNotEquals(students.get(1), deepCopy.get(1));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenCreatingDeepCopyWithCopyConstructor_thenObjectsShouldNotBeSame() {
|
||||||
|
|
||||||
|
Course course = new Course(1, "Spring Masterclass");
|
||||||
|
Student student1 = new Student(1, "John", course);
|
||||||
|
Student student2 = new Student(2, "David", course);
|
||||||
|
|
||||||
|
List<Student> students = new ArrayList<>();
|
||||||
|
students.add(student1);
|
||||||
|
students.add(student2);
|
||||||
|
|
||||||
|
List<Student> deepCopy = Student.deepCopyUsingCopyConstructor(students);
|
||||||
|
|
||||||
|
Assertions.assertNotEquals(students.get(0), deepCopy.get(0));
|
||||||
|
Assertions.assertNotEquals(students.get(1), deepCopy.get(1));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenCreatingDeepCopyWithSerializationUtils_thenObjectsShouldNotBeSame() {
|
||||||
|
|
||||||
|
Course course = new Course(1, "Spring Masterclass");
|
||||||
|
Student student1 = new Student(1, "John", course);
|
||||||
|
Student student2 = new Student(2, "David", course);
|
||||||
|
|
||||||
|
List<Student> students = new ArrayList<>();
|
||||||
|
students.add(student1);
|
||||||
|
students.add(student2);
|
||||||
|
|
||||||
|
List<Student> deepCopy = Student.deepCopyUsingSerialization(students);
|
||||||
|
|
||||||
|
Assertions.assertNotEquals(students.get(0), deepCopy.get(0));
|
||||||
|
Assertions.assertNotEquals(students.get(1), deepCopy.get(1));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenCreatingDeepCopyWithJackson_thenObjectsShouldNotBeSame() {
|
||||||
|
|
||||||
|
Course course = new Course(1, "Spring Masterclass");
|
||||||
|
Student student1 = new Student(1, "John", course);
|
||||||
|
Student student2 = new Student(2, "David", course);
|
||||||
|
|
||||||
|
List<Student> students = new ArrayList<>();
|
||||||
|
students.add(student1);
|
||||||
|
students.add(student2);
|
||||||
|
|
||||||
|
List<Student> deepCopy = Student.deepCopyUsingJackson(students);
|
||||||
|
|
||||||
|
Assertions.assertNotEquals(students.get(0), deepCopy.get(0));
|
||||||
|
Assertions.assertNotEquals(students.get(1), deepCopy.get(1));
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue