Make a changed copy and leave the original intact.

Update by Copy

UpdateByCopy.scala
case class Point(x: Int, y: Int)

object Main {
  def main(args: Array[String]): Unit = {
    val dx = 
    val origin = Point(0, 0)
    val x = origin.x + dx
    val moved = origin.copy(x = x)

    println("origin=" + origin.toString)
    println("moved=" + moved.toString)
    println("originUnchanged=" + (origin.x == 0))
  }
}
case class Point(x: Int, y: Int)

object Main {
  def main(args: Array[String]): Unit = {
    val dx = 
    val origin = Point(0, 0)
    val x = origin.x + dx
    val moved = origin.copy(x = x)

    println("origin=" + origin.toString)
    println("moved=" + moved.toString)
    println("originUnchanged=" + (origin.x == 0))
  }
}
case class Point(x: Int, y: Int)

object Main {
  def main(args: Array[String]): Unit = {
    val dx = 
    val origin = Point(0, 0)
    val x = origin.x + dx
    val moved = origin.copy(x = x)

    println("origin=" + origin.toString)
    println("moved=" + moved.toString)
    println("originUnchanged=" + (origin.x == 0))
  }
}
update-by-copy Immutable data is never changed in place. `copy` builds a new value with one field replaced while the original keeps its old fields.