Read fixed fields and calculate a derived value.

immutable-record An immutable object keeps its fields fixed. Code can calculate derived values without changing the object.

Immutable Records

dx
ImmutableRecord.scala
Replay: real traced execution (multi-file project)
class Point(val x: Int, val y: Int) {
  def summary: String = {
    x + "," + y
  }

  override def toString: String = "[point]"
}

object Main {
  def main(args: Array[String]): Unit = {
    val dx = 2
    val point = new Point(3, 5)
    val movedX = point.x + dx
    val movedSummary = movedX + "," + point.y

    println("original=" + point.summary)
    println("moved=" + movedSummary)
  }
}
class Point(val x: Int, val y: Int) {
  def summary: String = {
    x + "," + y
  }

  override def toString: String = "[point]"
}

object Main {
  def main(args: Array[String]): Unit = {
    val dx = 1
    val point = new Point(3, 5)
    val movedX = point.x + dx
    val movedSummary = movedX + "," + point.y

    println("original=" + point.summary)
    println("moved=" + movedSummary)
  }
}
class Point(val x: Int, val y: Int) {
  def summary: String = {
    x + "," + y
  }

  override def toString: String = "[point]"
}

object Main {
  def main(args: Array[String]): Unit = {
    val dx = 4
    val point = new Point(3, 5)
    val movedX = point.x + dx
    val movedSummary = movedX + "," + point.y

    println("original=" + point.summary)
    println("moved=" + movedSummary)
  }
}
  1. dx ← 2, point ← [point], movedX ← 5, movedSummary ← 5,5

    9object Main {10  def main(args: Array[String]): Unit = {11    val dx→ 2 = 2 //@dx=1, 412    val point→ [point] = new Point(3, 5)13    val movedX→ 5 = point[point].x + dx214    val movedSummary→ 5,5 = movedX5 + "," + point.y51516    println("original=" + point.summary)
  2. def summary: String =

    pass 1 of 3
    1class Point(val x: Int, val y: Int) {2  def summary: String = {3    x3 + "," + y54  }
  3. println("original=" + point.summary)

    16  println("original=" + point.summary3,5)17  println("moved=" + movedSummary)18}
  4. println("original=" + point.summary)

    16    println("original=" + point.summary3,5)17    println("moved=" + movedSummary5,5)18  }19}
    outputoriginal=3,5
    moved=5,5
  1. dx ← 1, point ← [point], movedX ← 4, movedSummary ← 4,5

    9object Main {10  def main(args: Array[String]): Unit = {11    val dx→ 1 = 112    val point→ [point] = new Point(3, 5)13    val movedX→ 4 = point[point].x + dx114    val movedSummary→ 4,5 = movedX4 + "," + point.y51516    println("original=" + point.summary)
  2. def summary: String =

    pass 1 of 3
    1class Point(val x: Int, val y: Int) {2  def summary: String = {3    x3 + "," + y54  }
  3. println("original=" + point.summary)

    16  println("original=" + point.summary3,5)17  println("moved=" + movedSummary)18}
  4. println("original=" + point.summary)

    16    println("original=" + point.summary3,5)17    println("moved=" + movedSummary4,5)18  }19}
    outputoriginal=3,5
    moved=4,5
  1. dx ← 4, point ← [point], movedX ← 7, movedSummary ← 7,5

    9object Main {10  def main(args: Array[String]): Unit = {11    val dx→ 4 = 412    val point→ [point] = new Point(3, 5)13    val movedX→ 7 = point[point].x + dx414    val movedSummary→ 7,5 = movedX7 + "," + point.y51516    println("original=" + point.summary)
  2. def summary: String =

    pass 1 of 3
    1class Point(val x: Int, val y: Int) {2  def summary: String = {3    x3 + "," + y54  }
  3. println("original=" + point.summary)

    16  println("original=" + point.summary3,5)17  println("moved=" + movedSummary)18}
  4. println("original=" + point.summary)

    16    println("original=" + point.summary3,5)17    println("moved=" + movedSummary7,5)18  }19}
    outputoriginal=3,5
    moved=7,5