Skip to content

Commit f24fef9

Browse files
wugangcajzheaux
authored andcommitted
[BAEL-3210] - Java Copy Constructor (eugenp#7706)
* [BAEL-3210] - Copy constructors in Java * [BAEL-3210] - Copy constructors in Java * Change indentation space based on code style instructions.
1 parent 648ef77 commit f24fef9

4 files changed

Lines changed: 164 additions & 0 deletions

File tree

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package com.baeldung.copyconstructor;
2+
3+
import java.util.Date;
4+
5+
public class Employee {
6+
7+
protected int id;
8+
protected String name;
9+
protected Date startDate;
10+
11+
public Employee(int id, String name, Date startDate) {
12+
this.id = id;
13+
this.name = name;
14+
this.startDate = startDate;
15+
}
16+
17+
public Employee(Employee employee) {
18+
this.id = employee.id;
19+
this.name = employee.name;
20+
this.startDate = new Date(employee.startDate.getTime());
21+
}
22+
23+
Date getStartDate() {
24+
return startDate;
25+
}
26+
27+
public Employee copy() {
28+
return new Employee(this);
29+
}
30+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package com.baeldung.copyconstructor;
2+
3+
import java.util.Date;
4+
import java.util.List;
5+
import java.util.stream.Collectors;
6+
7+
public class Manager extends Employee {
8+
9+
private List<Employee> directReports;
10+
11+
public Manager(int id, String name, Date startDate, List<Employee> directReports) {
12+
super(id, name, startDate);
13+
this.directReports = directReports;
14+
}
15+
16+
public Manager(Manager manager) {
17+
super(manager.id, manager.name, manager.startDate);
18+
this.directReports = manager.directReports.stream()
19+
.collect(Collectors.toList());
20+
}
21+
22+
@Override
23+
public Employee copy() {
24+
return new Manager(this);
25+
}
26+
27+
List<Employee> getDirectReport() {
28+
return this.directReports;
29+
}
30+
31+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package com.baeldung.copyconstructor;
2+
3+
import static org.junit.Assert.assertEquals;
4+
import static org.junit.Assert.assertNotEquals;
5+
6+
import java.util.Date;
7+
8+
import org.junit.Test;
9+
10+
public class EmployeeUnitTest {
11+
@Test
12+
public void givenCopyConstructor_whenDeepCopy_thenDistinct() {
13+
Date d1 = new Date(123);
14+
Employee e1 = new Employee(1, "Baeldung", d1);
15+
Employee e2 = new Employee(e1);
16+
assertEquals(d1, e1.getStartDate());
17+
assertEquals(d1, e2.getStartDate());
18+
19+
d1.setTime(456);
20+
assertEquals(d1, e1.getStartDate());
21+
assertNotEquals(d1, e2.getStartDate());
22+
}
23+
24+
@Test
25+
public void givenCopyMethod_whenCopy_thenDistinct() {
26+
Date d1 = new Date(123);
27+
Employee e1 = new Employee(1, "Baeldung", d1);
28+
Employee e2 = e1.copy();
29+
assertEquals(d1, e1.getStartDate());
30+
assertEquals(d1, e2.getStartDate());
31+
32+
d1.setTime(456);
33+
assertEquals(d1, e1.getStartDate());
34+
assertNotEquals(d1, e2.getStartDate());
35+
}
36+
}
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
package com.baeldung.copyconstructor;
2+
3+
import static org.junit.Assert.assertArrayEquals;
4+
import static org.junit.Assert.assertEquals;
5+
import static org.junit.Assert.assertTrue;
6+
7+
import java.util.ArrayList;
8+
import java.util.Date;
9+
import java.util.List;
10+
11+
import org.junit.Test;
12+
13+
public class ManagerUnitTest {
14+
@Test
15+
public void givenCopyConstructor_whenDeepCopy_thenDistinct() {
16+
Date startDate = new Date(123);
17+
Employee e1 = new Employee(1, "Baeldung", startDate);
18+
Employee e2 = new Employee(e1);
19+
List<Employee> directReports = new ArrayList<Employee>();
20+
directReports.add(e1);
21+
directReports.add(e2);
22+
23+
Manager m1 = new Manager(1, "Baeldung Manager", startDate, directReports);
24+
Manager m2 = new Manager(m1);
25+
List<Employee> directReports1 = m1.getDirectReport();
26+
List<Employee> directReports2 = m2.getDirectReport();
27+
assertEquals(directReports1.size(), directReports2.size());
28+
assertArrayEquals(directReports1.toArray(), directReports2.toArray());
29+
30+
// clear m1's direct reports list. m2's list should not be affected
31+
directReports.clear();
32+
directReports1 = m1.getDirectReport();
33+
directReports2 = m2.getDirectReport();
34+
assertEquals(0, directReports1.size());
35+
assertEquals(2, directReports2.size());
36+
37+
}
38+
39+
@Test
40+
public void givenCopyMethod_whenCopy_thenDistinct() {
41+
Date startDate = new Date(123);
42+
Employee e1 = new Employee(1, "Baeldung", startDate);
43+
Employee e2 = new Employee(e1);
44+
List<Employee> directReports = new ArrayList<Employee>();
45+
directReports.add(e1);
46+
directReports.add(e2);
47+
48+
// a Manager object whose declaration type is Employee.
49+
Employee source = new Manager(1, "Baeldung Manager", startDate, directReports);
50+
Employee clone = source.copy();
51+
52+
// after copy, clone should be still a Manager object.
53+
assertTrue(clone instanceof Manager);
54+
List<Employee> directReports1 = ((Manager) source).getDirectReport();
55+
List<Employee> directReports2 = ((Manager) clone).getDirectReport();
56+
assertEquals(directReports1.size(), directReports2.size());
57+
assertArrayEquals(directReports1.toArray(), directReports2.toArray());
58+
59+
// clear source's direct reports list. clone's list should not be affected
60+
directReports.clear();
61+
directReports1 = ((Manager) source).getDirectReport();
62+
directReports2 = ((Manager) clone).getDirectReport();
63+
assertEquals(0, directReports1.size());
64+
assertEquals(2, directReports2.size());
65+
66+
}
67+
}

0 commit comments

Comments
 (0)