Skip to content

Instantly share code, notes, and snippets.

@enshahar
Last active May 14, 2018 11:45
Show Gist options
  • Save enshahar/125ef1a3e93ebb77ec564c96e26a8ce5 to your computer and use it in GitHub Desktop.
Save enshahar/125ef1a3e93ebb77ec564c96e26a8ce5 to your computer and use it in GitHub Desktop.
Is Kotlin's data class copy() deep?
data class SubData(var x:Int, var y:String)
data class Data(val d:SubData, val i:Int)
val x = Data(SubData(10, "shared data"), 10)
val z = x.copy()
println("x.d.x = ${x.d.x}, x.d.y = ${x.d.y}")
println("z.d.x = ${z.d.x}, z.d.y = ${z.d.y}")
x.d.x = 100
println("after chaning x.d.x to 100")
println("x.d.x = ${x.d.x}, x.d.y = ${x.d.y}")
println("z.d.x = ${z.d.x}, z.d.y = ${z.d.y}")
val z2 = x.copy(d = SubData(100,"new data"))
x.d.x = 200
println("after setting d a new SubData and chaning x.d.x to 200")
println("x.d.x = ${x.d.x}, x.d.y = ${x.d.y}")
println("z.d.x = ${z.d.x}, z.d.y = ${z.d.y}")
println("z2.d.x = ${z2.d.x}, z2.d.y = ${z2.d.y}")
// $ kotlinc -script DataCopy.kts
// x.d.x = 10, x.d.y = shared data
// z.d.x = 10, z.d.y = shared data
// after chaning x.d.x to 100
// x.d.x = 100, x.d.y = shared data
// z.d.x = 100, z.d.y = shared data
// after setting d a new SubData and chaning x.d.x to 200
// x.d.x = 200, x.d.y = shared data
// z.d.x = 200, z.d.y = shared data
// z2.d.x = 100, z2.d.y = new data
@enshahar
Copy link
Author

enshahar commented Jul 29, 2017

scala is pretty same:

scala> case class X(var t:Int)
defined class X

scala> case class Y(t1:X, t2:X)
defined class Y

scala> val x = Y(X(10),X(20))
x: Y = Y(X(10),X(20))

scala> val y = x.copy()
y: Y = Y(X(10),X(20))

scala> x
res1: Y = Y(X(10),X(20))

scala> y
res2: Y = Y(X(10),X(20))

scala> x.t1
res3: X = X(10)

scala> x.t1.t = 100
x.t1.t: Int = 100

scala> x
res4: Y = Y(X(100),X(20))

scala> y
res5: Y = Y(X(100),X(20))

@enshahar
Copy link
Author

enshahar commented Jul 29, 2017

so the key point here is "scala and kotlin uses the immutablilty to provide the deep-copying in their copy(), actually that is the sharing of same sub-object-graph"

@cwdoh
Copy link

cwdoh commented Jul 29, 2017

+1 :)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment