bbarker
bbarker

Reputation: 13088

How to get a case class's 'copy' to use an overridden 'clone'?

I suppose the obvious solution is to call .clone.copy everywhere, but there are certain applications where calling .copy without .clone might be dangerous or hard to debug.

This seems to demonstrate that clone (or the overridden clone), is not used by copy:

class Process {
  def replicate: Process = {
    println("Hello from Process.replicate")
    new Process()
  }
}

final case class Processes(
  process1: Process,
  process2: Process
) {
  override def clone: Processes = Processes(
    process1.replicate, process2.replicate)
}

val origProcesses = Processes(new Process, new Process)
val clonedProcesses = origProcesses.copy(process1 = new Process)

Upvotes: 0

Views: 315

Answers (1)

Jack Leow
Jack Leow

Reputation: 22477

You could provide your own copy method:

final case class Processes(
  process1: Process,
  process2: Process
) {
  override def clone: Processes = Processes(
    process1.replicate, process2.replicate)
  def copy(process1: Process = this.process1.replicate, process2: Process = this.process2.replicate): Processes = Processes(
    process1, process2)
}

In which case, you won't get the "free" copy method provided by Scala, but you can still avoid implementing your own equals, hashCode and companion object apply, unapply etc.

Upvotes: 2

Related Questions