@@ -7,147 +7,156 @@ data class Address(var street: String, var city: String) : Cloneable {
7
7
8
8
public override fun clone (): Address = super .clone() as Address
9
9
10
- // constructor(address: Address) : this(address.street, address.city)
10
+ constructor (address: Address ) : this (address.street, address.city)
11
+
12
+ fun deepCopy (
13
+ street : String = this.street,
14
+ city : String = this.city
15
+ ) = Address (street, city)
11
16
}
12
17
13
18
data class Person (var name : String , var address : Address ) : Cloneable {
14
19
15
20
public override fun clone () = Person (name, this .address.clone())
16
21
17
- fun deepCopy (name : String = this.name, address : Address = this.address.copy()): Person {
18
- return Person (name, address)
19
- }
22
+ fun deepCopy (
23
+ name : String = this.name,
24
+ address : Address = this.address.deepCopy()
25
+ ) = Person (name, address)
20
26
21
- constructor (person: Person ) : this (person.name, person.address.copy( ))
27
+ constructor (person: Person ) : this (person.name, Address ( person.address))
22
28
}
23
29
24
30
data class Company (var name : String , var industry : String , val ceo : Person , val employees : List <Person >) : Cloneable {
25
31
26
- fun deepCopy (name : String = this.name, industry : String = this.industry, ceo : Person = this.ceo.deepCopy(),
27
- employees : List <Person > = this.employees.map { it.deepCopy() }): Company {
28
- return Company (name, industry, ceo, employees)
29
- }
32
+ fun deepCopy (
33
+ name : String = this.name,
34
+ industry : String = this.industry,
35
+ ceo : Person = this.ceo.deepCopy(),
36
+ employees : List <Person > = this.employees.map { it.deepCopy() },
37
+ ) = Company (name, industry, ceo, employees)
30
38
31
- public override fun clone (): Company {
32
- return Company (name, industry, ceo.clone(), employees.map { it.clone() })
33
- }
39
+ public override fun clone () = Company (name, industry, ceo.clone(), employees.map { it.clone() })
34
40
35
- constructor (company: Company ) : this (company.name, company.industry, Person (company.ceo),
41
+ constructor (company: Company ) : this (
42
+ company.name,
43
+ company.industry,
44
+ Person (company.ceo),
36
45
company.employees.map { Person (it) })
37
46
}
38
47
39
48
data class Organization (var name : String , val headquarters : Address , val companies : List <Company >) : Cloneable {
40
49
41
- fun deepCopy (name : String = this.name, headquarters : Address = this.headquarters.copy(),
42
- companies : List <Company > = this.companies.map { it.deepCopy() }) : Organization {
43
- return Organization (name, headquarters, companies)
44
- }
50
+ fun deepCopy (
51
+ name : String = this.name,
52
+ headquarters : Address = this.headquarters.deepCopy(),
53
+ companies : List <Company > = this.companies.map { it.deepCopy() },
54
+ ) = Organization (name, headquarters, companies)
45
55
46
- public override fun clone (): Organization {
47
- return Organization (name, headquarters.clone(), companies.map { it.clone() })
48
- }
56
+ public override fun clone () = Organization (name, headquarters.clone(), companies.map { it.clone() })
49
57
50
- constructor (organization: Organization ) : this (organization.name, organization.headquarters.copy(),
58
+ constructor (organization: Organization ) : this (
59
+ organization.name,
60
+ Address (organization.headquarters),
51
61
organization.companies.map { Company (it) })
52
62
}
53
63
54
- enum class Approaches {
55
- COPY ,
56
- CLONE ,
57
- SECONDARY_CONSTRUCTOR ,
58
- CUSTOM_DEEP_COPY
59
- }
60
-
61
64
class CloningObjectUnitTest {
62
65
63
- @Test
64
- fun `when cloned object then proves that deep copy` (){
65
- val personHangga = Person (" Hangga Aji Sayekti" , Address (" Jln. Kemasan No 53" , " Yogyakarta" ))
66
- val personRaihan = Person (" Raihan Kusumo" , Address (" Jln. Cikapayang No. 508" , " Medan" ))
67
- val personLayla = Person (" Layla Hinchcliffe" , Address (" Collins Street" , " Melbourne" ))
68
- val companyBasen = Company (" Basen Software" , " Tech" , personHangga, listOf (personRaihan, personLayla))
69
-
70
- val personBima = Person (" Bima Arya" , Address (" Jl. Colombo No. 7" , " Yogyakarta" ))
71
- val personDina = Person (" Dina Fitriani" , Address (" Jl. Kaliurang No. 12" , " Yogyakarta" ))
72
- val personCindy = Person (" Cindy Claudia" , Address (" Jl. Atmosukarto No. 1" , " Yogyakarta" ))
73
- val companyKotagede = Company (" Kotagede Software" , " Tech" , personBima, listOf (personCindy, personDina))
74
-
75
- val organization = Organization (" Bekraf" , Address (" Jalan Medan Merdeka Selatan" , " Jakarta" ), listOf (companyBasen, companyKotagede))
76
-
77
- val copiedOrganization = organization.copy(
78
- headquarters = organization.headquarters.copy(),
79
- companies = organization.companies.map { company ->
80
- company.copy(
81
- ceo = company.ceo.copy(),
82
- employees = company.employees.map { it.copy() }
83
- )
84
- }
85
- )
86
-
87
- val clonedOrganization = organization.clone()
66
+ private val personHangga = Person (" Hangga Aji Sayekti" , Address (" Jln. Kemasan No 53" , " Yogyakarta" ))
67
+ private val personRaihan = Person (" Raihan Kusumo" , Address (" Jln. Cikapayang No. 508" , " Medan" ))
68
+ private val personLayla = Person (" Layla Hinchcliffe" , Address (" Collins Street" , " Melbourne" ))
69
+ private val companyBasen = Company (" Basen Software" , " Tech" , personHangga, listOf (personRaihan, personLayla))
88
70
89
- val clonedSecondaryOrganization = Organization (organization)
71
+ private val personBima = Person (" Bima Arya" , Address (" Jl. Colombo No. 7" , " Yogyakarta" ))
72
+ private val personDina = Person (" Dina Fitriani" , Address (" Jl. Kaliurang No. 12" , " Yogyakarta" ))
73
+ private val personCindy = Person (" Cindy Claudia" , Address (" Jl. Atmosukarto No. 1" , " Yogyakarta" ))
74
+ private val companyKotagede = Company (" Kotagede Software" , " Tech" , personBima, listOf (personCindy, personDina))
90
75
91
- val coustomDeepCopyOrganization = organization.deepCopy()
76
+ private val organization = Organization (" Bekraf" ,Address (" Jalan Medan Merdeka Selatan" ,
77
+ " Jakarta" ),listOf (companyBasen, companyKotagede))
92
78
93
- // Modify the original object to verify deep copy
79
+ private fun modifyOrganization () {
94
80
organization.name = " New Org Name"
95
81
organization.headquarters.city = " New City"
96
82
organization.companies.first().name = " New Company Name"
97
83
organization.companies.first().ceo.name = " New CEO Name"
98
84
organization.companies.first().employees.first().name = " New Employee Name"
85
+ }
99
86
100
- // verify deep copy with copy()
101
- assertThat(copiedOrganization.headquarters.city)
102
- .isNotEqualTo( " New City " )
87
+ @Test
88
+ fun `when cloned object with secondary constructor then proves that deep copy` () {
89
+ val clonedOrganization = Organization (organization )
103
90
104
- assertThat(copiedOrganization.companies.first().name)
105
- .isNotEqualTo(" New Company Name" )
91
+ modifyOrganization()
106
92
107
- assertThat(copiedOrganization.companies.first().ceo.name)
93
+ assertThat(clonedOrganization)
94
+ .isNotSameAs(organization)
95
+ assertThat(clonedOrganization.headquarters.city)
96
+ .isNotEqualTo(" New City" )
97
+ assertThat(clonedOrganization.companies.first().name)
98
+ .isNotEqualTo(" New Company Name" )
99
+ assertThat(clonedOrganization.companies.first().ceo.name)
108
100
.isNotEqualTo(" New CEO Name" )
109
-
110
- assertThat(copiedOrganization.companies.first().employees.first().name)
101
+ assertThat(clonedOrganization.companies.first().employees.first().name)
111
102
.isNotEqualTo(" New Employee Name" )
103
+ }
104
+
105
+ @Test
106
+ fun `when cloned object with deepCopy() then proves that deep copy` () {
107
+ val clonedOrganization = organization.deepCopy()
108
+
109
+ modifyOrganization()
112
110
113
- // verify deep copy with clone()
111
+ assertThat(clonedOrganization)
112
+ .isNotSameAs(organization)
114
113
assertThat(clonedOrganization.headquarters.city)
115
114
.isNotEqualTo(" New City" )
116
-
117
115
assertThat(clonedOrganization.companies.first().name)
118
116
.isNotEqualTo(" New Company Name" )
119
-
120
117
assertThat(clonedOrganization.companies.first().ceo.name)
121
118
.isNotEqualTo(" New CEO Name" )
122
-
123
119
assertThat(clonedOrganization.companies.first().employees.first().name)
124
120
.isNotEqualTo(" New Employee Name" )
121
+ }
125
122
123
+ @Test
124
+ fun `when cloned object with clone() then proves that deep copy` () {
125
+ val clonedOrganization = organization.clone()
126
126
127
- // verify deep copy with secondary()
128
- assertThat(clonedSecondaryOrganization.headquarters.city)
129
- .isNotEqualTo(" New City" )
127
+ modifyOrganization()
130
128
131
- assertThat(clonedSecondaryOrganization.companies.first().name)
129
+ assertThat(clonedOrganization)
130
+ .isNotSameAs(organization)
131
+ assertThat(clonedOrganization.headquarters.city)
132
+ .isNotEqualTo(" New City" )
133
+ assertThat(clonedOrganization.companies.first().name)
132
134
.isNotEqualTo(" New Company Name" )
133
-
134
- assertThat(clonedSecondaryOrganization.companies.first().ceo.name)
135
+ assertThat(clonedOrganization.companies.first().ceo.name)
135
136
.isNotEqualTo(" New CEO Name" )
136
-
137
- assertThat(clonedSecondaryOrganization.companies.first().employees.first().name)
137
+ assertThat(clonedOrganization.companies.first().employees.first().name)
138
138
.isNotEqualTo(" New Employee Name" )
139
+ }
139
140
140
- // deep copy
141
- assertThat(coustomDeepCopyOrganization.headquarters.city)
142
- .isNotEqualTo(" New City" )
141
+ @Test
142
+ fun `when cloned object with copy() then proves that deep copy` () {
143
143
144
- assertThat(coustomDeepCopyOrganization.companies.first().name)
145
- .isNotEqualTo(" New Company Name" )
144
+ val clonedOrganization = organization.copy(headquarters = organization.headquarters.copy(),
145
+ companies = organization.companies.map { company -> company.copy(
146
+ ceo = company.ceo.copy(), employees = company.employees.map {it.copy()})
147
+ })
146
148
147
- assertThat(coustomDeepCopyOrganization.companies.first().ceo.name)
148
- .isNotEqualTo(" New CEO Name" )
149
+ modifyOrganization()
149
150
150
- assertThat(coustomDeepCopyOrganization.companies.first().employees.first().name)
151
+ assertThat(clonedOrganization)
152
+ .isNotSameAs(organization)
153
+ assertThat(clonedOrganization.headquarters.city)
154
+ .isNotEqualTo(" New City" )
155
+ assertThat(clonedOrganization.companies.first().name)
156
+ .isNotEqualTo(" New Company Name" )
157
+ assertThat(clonedOrganization.companies.first().ceo.name)
158
+ .isNotEqualTo(" New CEO Name" )
159
+ assertThat(clonedOrganization.companies.first().employees.first().name)
151
160
.isNotEqualTo(" New Employee Name" )
152
161
}
153
162
}
0 commit comments