[BAEL-3210] - Java Copy Constructor (#7706)
* [BAEL-3210] - Copy constructors in Java * [BAEL-3210] - Copy constructors in Java * Change indentation space based on code style instructions.
This commit is contained in:
parent
648ef77f5d
commit
f24fef9ec6
|
@ -0,0 +1,30 @@
|
|||
package com.baeldung.copyconstructor;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
public class Employee {
|
||||
|
||||
protected int id;
|
||||
protected String name;
|
||||
protected Date startDate;
|
||||
|
||||
public Employee(int id, String name, Date startDate) {
|
||||
this.id = id;
|
||||
this.name = name;
|
||||
this.startDate = startDate;
|
||||
}
|
||||
|
||||
public Employee(Employee employee) {
|
||||
this.id = employee.id;
|
||||
this.name = employee.name;
|
||||
this.startDate = new Date(employee.startDate.getTime());
|
||||
}
|
||||
|
||||
Date getStartDate() {
|
||||
return startDate;
|
||||
}
|
||||
|
||||
public Employee copy() {
|
||||
return new Employee(this);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,31 @@
|
|||
package com.baeldung.copyconstructor;
|
||||
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
public class Manager extends Employee {
|
||||
|
||||
private List<Employee> directReports;
|
||||
|
||||
public Manager(int id, String name, Date startDate, List<Employee> directReports) {
|
||||
super(id, name, startDate);
|
||||
this.directReports = directReports;
|
||||
}
|
||||
|
||||
public Manager(Manager manager) {
|
||||
super(manager.id, manager.name, manager.startDate);
|
||||
this.directReports = manager.directReports.stream()
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
|
||||
@Override
|
||||
public Employee copy() {
|
||||
return new Manager(this);
|
||||
}
|
||||
|
||||
List<Employee> getDirectReport() {
|
||||
return this.directReports;
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,36 @@
|
|||
package com.baeldung.copyconstructor;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertNotEquals;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
public class EmployeeUnitTest {
|
||||
@Test
|
||||
public void givenCopyConstructor_whenDeepCopy_thenDistinct() {
|
||||
Date d1 = new Date(123);
|
||||
Employee e1 = new Employee(1, "Baeldung", d1);
|
||||
Employee e2 = new Employee(e1);
|
||||
assertEquals(d1, e1.getStartDate());
|
||||
assertEquals(d1, e2.getStartDate());
|
||||
|
||||
d1.setTime(456);
|
||||
assertEquals(d1, e1.getStartDate());
|
||||
assertNotEquals(d1, e2.getStartDate());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenCopyMethod_whenCopy_thenDistinct() {
|
||||
Date d1 = new Date(123);
|
||||
Employee e1 = new Employee(1, "Baeldung", d1);
|
||||
Employee e2 = e1.copy();
|
||||
assertEquals(d1, e1.getStartDate());
|
||||
assertEquals(d1, e2.getStartDate());
|
||||
|
||||
d1.setTime(456);
|
||||
assertEquals(d1, e1.getStartDate());
|
||||
assertNotEquals(d1, e2.getStartDate());
|
||||
}
|
||||
}
|
|
@ -0,0 +1,67 @@
|
|||
package com.baeldung.copyconstructor;
|
||||
|
||||
import static org.junit.Assert.assertArrayEquals;
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
public class ManagerUnitTest {
|
||||
@Test
|
||||
public void givenCopyConstructor_whenDeepCopy_thenDistinct() {
|
||||
Date startDate = new Date(123);
|
||||
Employee e1 = new Employee(1, "Baeldung", startDate);
|
||||
Employee e2 = new Employee(e1);
|
||||
List<Employee> directReports = new ArrayList<Employee>();
|
||||
directReports.add(e1);
|
||||
directReports.add(e2);
|
||||
|
||||
Manager m1 = new Manager(1, "Baeldung Manager", startDate, directReports);
|
||||
Manager m2 = new Manager(m1);
|
||||
List<Employee> directReports1 = m1.getDirectReport();
|
||||
List<Employee> directReports2 = m2.getDirectReport();
|
||||
assertEquals(directReports1.size(), directReports2.size());
|
||||
assertArrayEquals(directReports1.toArray(), directReports2.toArray());
|
||||
|
||||
// clear m1's direct reports list. m2's list should not be affected
|
||||
directReports.clear();
|
||||
directReports1 = m1.getDirectReport();
|
||||
directReports2 = m2.getDirectReport();
|
||||
assertEquals(0, directReports1.size());
|
||||
assertEquals(2, directReports2.size());
|
||||
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenCopyMethod_whenCopy_thenDistinct() {
|
||||
Date startDate = new Date(123);
|
||||
Employee e1 = new Employee(1, "Baeldung", startDate);
|
||||
Employee e2 = new Employee(e1);
|
||||
List<Employee> directReports = new ArrayList<Employee>();
|
||||
directReports.add(e1);
|
||||
directReports.add(e2);
|
||||
|
||||
// a Manager object whose declaration type is Employee.
|
||||
Employee source = new Manager(1, "Baeldung Manager", startDate, directReports);
|
||||
Employee clone = source.copy();
|
||||
|
||||
// after copy, clone should be still a Manager object.
|
||||
assertTrue(clone instanceof Manager);
|
||||
List<Employee> directReports1 = ((Manager) source).getDirectReport();
|
||||
List<Employee> directReports2 = ((Manager) clone).getDirectReport();
|
||||
assertEquals(directReports1.size(), directReports2.size());
|
||||
assertArrayEquals(directReports1.toArray(), directReports2.toArray());
|
||||
|
||||
// clear source's direct reports list. clone's list should not be affected
|
||||
directReports.clear();
|
||||
directReports1 = ((Manager) source).getDirectReport();
|
||||
directReports2 = ((Manager) clone).getDirectReport();
|
||||
assertEquals(0, directReports1.size());
|
||||
assertEquals(2, directReports2.size());
|
||||
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue